"""日期时间工具模块"""

from datetime import datetime, timezone
import pytz


def shanghai_str_to_utc_str(shanghai_time_str: str) -> str:
    """
    将上海时间字符串（YYYY-MM-DD HH:MM:SS格式）转换为UTC时间字符串（ISO 8601格式: YYYY-MM-DDTHH:MM:SSZ）
    
    Args:
        shanghai_time_str: 上海时间字符串，格式为 "YYYY-MM-DD HH:MM:SS"
    Returns:
        UTC时间字符串，格式为 "YYYY-MM-DDTHH:MM:SSZ"
    """
    # 解析上海时间字符串
    shanghai_time = datetime.strptime(shanghai_time_str, "%Y-%m-%d %H:%M:%S")
    
    # 设置时区为上海时区（东八区）
    shanghai_tz = pytz.timezone('Asia/Shanghai')
    shanghai_time_with_tz = shanghai_tz.localize(shanghai_time)
    
    # 转换为UTC时间
    utc_time = shanghai_time_with_tz.astimezone(timezone.utc)
    
    # 格式化为ISO 8601格式
    return utc_time.strftime("%Y-%m-%dT%H:%M:%SZ")


def utc_str_to_shanghai_str(utc_time_str: str) -> str:
    """
    将UTC时间字符串（ISO 8601格式: YYYY-MM-DDTHH:MM:SSZ）转换为上海时间字符串（YYYY-MM-DD HH:MM:SS格式）
    
    Args:
        utc_time_str: UTC时间字符串，格式为 "YYYY-MM-DDTHH:MM:SSZ"
    Returns:
        上海时间字符串，格式为 "YYYY-MM-DD HH:MM:SS"
    """
    # 解析UTC时间字符串
    utc_time = datetime.strptime(utc_time_str, "%Y-%m-%dT%H:%M:%SZ")
    
    # 设置UTC时区
    utc_time_with_tz = utc_time.replace(tzinfo=timezone.utc)
    
    # 转换为上海时间
    shanghai_tz = pytz.timezone('Asia/Shanghai')
    shanghai_time = utc_time_with_tz.astimezone(shanghai_tz)
    
    # 格式化为指定格式
    return shanghai_time.strftime("%Y-%m-%d %H:%M:%S")


def shanghai_to_utc(shanghai_time: datetime) -> datetime:
    """
    将上海时间datetime对象转换为UTC时间datetime对象
    
    Args:
        shanghai_time: 上海时间的datetime对象
        
    Returns:
        UTC时间的datetime对象
    """
    # 设置时区为上海时区（东八区）
    shanghai_tz = pytz.timezone('Asia/Shanghai')
    
    # 如果输入的时间没有时区信息，则添加上海时区
    if shanghai_time.tzinfo is None:
        shanghai_time = shanghai_tz.localize(shanghai_time)
    else:
        # 如果已有时区信息，则转换到上海时区
        shanghai_time = shanghai_time.astimezone(shanghai_tz)
    
    # 转换为UTC时间
    utc_time = shanghai_time.astimezone(timezone.utc)
    
    return utc_time


def utc_to_shanghai(utc_time: datetime) -> datetime:
    """
    将UTC时间datetime对象转换为上海时间datetime对象
    
    Args:
        utc_time: UTC时间的datetime对象
        
    Returns:
        上海时间的datetime对象
    """
    # 设置UTC时区
    utc_tz = pytz.UTC
    
    # 如果输入的时间没有时区信息，则添加UTC时区
    if utc_time.tzinfo is None:
        utc_time = utc_tz.localize(utc_time)
    else:
        # 如果已有时区信息，则转换到UTC时区
        utc_time = utc_time.astimezone(utc_tz)
    
    # 转换为上海时间
    shanghai_tz = pytz.timezone('Asia/Shanghai')
    shanghai_time = utc_time.astimezone(shanghai_tz)
    
    return shanghai_time


def now_shanghai() -> datetime:
    """
    获取当前上海时间
    
    Returns:
        当前上海时间的datetime对象（带时区信息）
    """
    shanghai_tz = pytz.timezone('Asia/Shanghai')
    return datetime.now(shanghai_tz)


def now_utc() -> datetime:
    """
    获取当前UTC时间
    
    Returns:
        当前UTC时间的datetime对象（带时区信息）
    """
    return datetime.now(timezone.utc)