# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

from libcloud.storage.types import Provider
from libcloud.storage.providers import get_driver

OSSDriver = get_driver(Provider.ALIYUN_OSS)

your_access_key_id = ""
your_access_key_secret = ""
oss = OSSDriver(your_access_key_id, your_access_key_secret)

container_name = "CONTAINER_NAME_FOR_TEST"
object_name = "OBJECT_NAME_FOR_TEST"
local_file_path = "LOCAL_FILE_FULL_PATH_TO_UPLOAD"
upload_object_name = "OBJECT_NAME_FOR_UPLOAD_FILE"
for container in oss.iterate_containers():
    print("container: %s" % container)

c1 = oss.get_container(container_name)
print("Got container %s:" % c1)

objects = c1.list_objects()
count = len(objects)
print("Has %d objects" % count)

objects = oss.list_container_objects(c1, prefix="en")
print('Has %d objects with prefix "en"' % len(objects))
for each in objects:
    print(each)

obj = oss.get_object(container_name, object_name)
print("Got object %s:" % obj)

# Download object
oss.download_object(obj, object_name, overwrite_existing=True)
for trunk in oss.download_object_as_stream(obj):
    print(trunk)

# Upload object
obj = oss.upload_object(local_file_path, c1, upload_object_name)

# Upload multipart
uploads = list(oss.ex_iterate_multipart_uploads(c1))
print("Found %d incompleted uploads" % len(uploads))
if len(uploads) > 0:
    oss.ex_abort_all_multipart_uploads(c1)
    print("Abort them all")


def data_iter(limit):
    i = 0
    while True:
        yield i
        i += 1
        if i >= limit:
            break


print("Starting to upload 1MB using multipart api")
one_mb = 1024 * 1024
obj = oss.upload_object_via_stream(data_iter(one_mb), c1, upload_object_name)
print("Finish uploading")

# Delete objects
print("Delete object %s" % obj)
oss.delete_object(obj)

# Create container
#  c2 = oss.create_container(container_name='20160117')
#  c2 = oss.create_container(container_name='20160117',
#  ex_location='oss-cn-beijing')
#  c2_got = oss.get_container('20160117')
