#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
restore_object 方法使用示例

该示例演示了如何使用 restore_object 方法恢复归档的对象，
包括使用新增的 JobParameters 和 Tier 参数。
"""

import os
from ks3.connection import Connection

# 从环境变量获取配置
access_key = os.environ.get('KS3_IAM_ACCESS_KEY_ID')
secret_key = os.environ.get('KS3_IAM_ACCESS_KEY_SECRET')
bucket_name = os.environ.get('KS3_BUCKET')

# 初始化连接
conn = Connection(access_key, secret_key, host='ks3-cn-beijing.ksyuncs.com')
bucket = conn.get_bucket(bucket_name)


def example_restore_with_days_only():
    """示例1: 仅使用 days 参数恢复对象"""
    print("\n示例1: 仅使用 days 参数恢复对象")
    print("-" * 50)

    key_name = 'archived-file.txt'
    days = 3  # 恢复后保留3天

    try:
        result = bucket.restore_object(key_name, days=days)
        print(f"✓ 成功发起恢复请求")
        print(f"  状态码: {result.status}")
        print(f"  对象: {key_name}")
        print(f"  保留天数: {days}")
    except Exception as e:
        print(f"✗ 恢复失败: {e}")


def example_restore_with_tier_only():
    """示例2: 仅使用 tier 参数恢复对象"""
    print("\n示例2: 仅使用 tier 参数恢复对象")
    print("-" * 50)

    key_name = 'archived-file.txt'
    tier = 'Standard'  # 标准检索速度

    try:
        result = bucket.restore_object(key_name, tier=tier)
        print(f"✓ 成功发起恢复请求")
        print(f"  状态码: {result.status}")
        print(f"  对象: {key_name}")
        print(f"  检索层级: {tier}")
    except Exception as e:
        print(f"✗ 恢复失败: {e}")


def example_restore_with_days_and_tier():
    """示例3: 同时使用 days 和 tier 参数恢复对象"""
    print("\n示例3: 同时使用 days 和 tier 参数恢复对象")
    print("-" * 50)

    key_name = 'archived-file.txt'
    days = 5
    tier = 'Standard'

    try:
        result = bucket.restore_object(key_name, days=days, tier=tier)
        print(f"✓ 成功发起恢复请求")
        print(f"  状态码: {result.status}")
        print(f"  对象: {key_name}")
        print(f"  保留天数: {days}")
        print(f"  检索层级: {tier}")
    except Exception as e:
        print(f"✗ 恢复失败: {e}")


def example_restore_different_tiers():
    """示例4: 使用不同的检索层级"""
    print("\n示例4: 使用不同的检索层级")
    print("-" * 50)

    key_name = 'archived-file.txt'
    tiers = {
        'Expedited': '加急检索 - 1-5分钟内完成',
        'Standard': '标准检索 - 3-5小时内完成',
        'Bulk': '批量检索 - 5-12小时内完成'
    }

    for tier, description in tiers.items():
        print(f"\n使用 {tier} 层级:")
        print(f"  说明: {description}")
        try:
            result = bucket.restore_object(key_name, days=3, tier=tier)
            print(f"  ✓ 恢复请求已发起")
        except Exception as e:
            print(f"  ✗ 失败: {e}")


def example_restore_using_key_object():
    """示例5: 使用 Key 对象的 restore_object 方法"""
    print("\n示例5: 使用 Key 对象的 restore_object 方法")
    print("-" * 50)

    key_name = 'archived-file.txt'
    key = bucket.get_key(key_name)

    if key:
        try:
            result = key.restore_object(days=3, tier='Standard')
            print(f"✓ 成功发起恢复请求")
            print(f"  状态码: {result.status}")
            print(f"  对象: {key.name}")
        except Exception as e:
            print(f"✗ 恢复失败: {e}")
    else:
        print(f"✗ 对象 {key_name} 不存在")


def example_restore_with_custom_headers():
    """示例6: 使用自定义 headers"""
    print("\n示例6: 使用自定义 headers")
    print("-" * 50)

    key_name = 'archived-file.txt'
    headers = {
        'x-custom-header': 'custom-value'
    }

    try:
        result = bucket.restore_object(
            key_name,
            days=3,
            tier='Standard',
            headers=headers
        )
        print(f"✓ 成功发起恢复请求 (带自定义 headers)")
        print(f"  状态码: {result.status}")
    except Exception as e:
        print(f"✗ 恢复失败: {e}")


def example_restore_xml_format():
    """示例7: 生成的 XML 请求体格式说明"""
    print("\n示例7: 生成的 XML 请求体格式")
    print("-" * 50)

    print("\n当同时指定 days 和 tier 时，生成的 XML 格式如下:")
    print("""
<RestoreRequest>
    <Days>3</Days>
    <JobParameters>
        <Tier>Standard</Tier>
    </JobParameters>
</RestoreRequest>
    """)

    print("\n当仅指定 days 时:")
    print("""
<RestoreRequest>
    <Days>3</Days>
</RestoreRequest>
    """)

    print("\n当仅指定 tier 时:")
    print("""
<RestoreRequest>
    <JobParameters>
        <Tier>Standard</Tier>
    </JobParameters>
</RestoreRequest>
    """)


if __name__ == '__main__':
    print("=" * 50)
    print("restore_object 方法使用示例")
    print("=" * 50)

    # 注意: 以下示例需要实际的归档对象才能正常工作
    # 如果对象不存在或未归档，调用会返回错误

    # 取消下面的注释来运行示例
    # example_restore_with_days_only()
    # example_restore_with_tier_only()
    # example_restore_with_days_and_tier()
    # example_restore_different_tiers()
    # example_restore_using_key_object()
    # example_restore_with_custom_headers()

    # 显示 XML 格式说明（无需实际对象）
    example_restore_xml_format()

    print("\n" + "=" * 50)
    print("示例运行完毕")
    print("=" * 50)
