"""S3 boto3 客户端封装模块

根据选定的集群配置创建 boto3 S3 客户端。
"""
import boto3
from botocore.config import Config
from typing import Optional

from .config import ClusterConfig, get_cluster

# 全局当前集群名称（由 __main__.py 在解析全局参数后设置）
_current_cluster_name: Optional[str] = None


def set_cluster(name: Optional[str]) -> None:
    """设置当前使用的集群名称"""
    global _current_cluster_name
    _current_cluster_name = name


def get_s3_client():
    """获取当前配置的 boto3 S3 client

    Returns:
        boto3 S3 client 对象
    """
    cluster = get_cluster(_current_cluster_name)
    return _create_client(cluster)


def get_s3_resource():
    """获取当前配置的 boto3 S3 resource

    Returns:
        boto3 S3 resource 对象
    """
    cluster = get_cluster(_current_cluster_name)
    return _create_resource(cluster)


def _create_client(cluster: ClusterConfig):
    """根据集群配置创建 boto3 S3 client"""
    return boto3.client(
        "s3",
        endpoint_url=cluster.endpoint_url,
        aws_access_key_id=cluster.access_key,
        aws_secret_access_key=cluster.secret_key,
        region_name=cluster.region,
        config=Config(signature_version="s3v4"),
    )


def _create_resource(cluster: ClusterConfig):
    """根据集群配置创建 boto3 S3 resource"""
    return boto3.resource(
        "s3",
        endpoint_url=cluster.endpoint_url,
        aws_access_key_id=cluster.access_key,
        aws_secret_access_key=cluster.secret_key,
        region_name=cluster.region,
        config=Config(signature_version="s3v4"),
    )
