import time
import datetime
from enum import Enum


class TimeUtils:
    """
    时间工具类
    功能：
    1. 获取当前时间的各种格式化输出
    2. 时间转换
    3. 时间计算
    """

    class Weekday(Enum):
        MONDAY = "星期一"
        TUESDAY = "星期二"
        WEDNESDAY = "星期三"
        THURSDAY = "星期四"
        FRIDAY = "星期五"
        SATURDAY = "星期六"
        SUNDAY = "星期日"

    @staticmethod
    def get_current_time():
        """
        获取当前时间，格式：年-月-日-时-分
        返回：str，例如：2023-11-15-14-30
        """
        now = datetime.datetime.now()
        return now.strftime("%Y-%m-%d-%H-%M")

    @staticmethod
    def get_current_time_str():
        """
        获取当前时间，格式：年-月-日-时-分
        返回：str，例如：2023-11-15-14-30
        """
        now = datetime.datetime.now()
        return now.strftime("%Y%m%d%H%M")

    @staticmethod
    def get_current_time_with_weekday():
        """
        获取当前时间和星期几
        返回：str，例如：2023-11-15-14-30 星期三
        """
        now = datetime.datetime.now()
        weekday = TimeUtils.Weekday((now.weekday() + 1) % 7 + 1).value
        return f"{now.strftime('%Y-%m-%d-%H-%M')} {weekday}"

    @staticmethod
    def get_timestamp():
        """
        获取当前时间戳
        返回：int，例如：1636969800
        """
        return int(time.time())

    @staticmethod
    def get_formatted_time(timestamp=None, format_str="%Y-%m-%d %H:%M:%S"):
        """
        格式化时间
        :param timestamp: 时间戳，默认为当前时间
        :param format_str: 格式字符串
        返回：str，例如：2023-11-15 14:30:00
        """
        if timestamp is None:
            timestamp = time.time()
        return time.strftime(format_str, time.localtime(timestamp))

    @staticmethod
    def time_str_to_timestamp(time_str, format_str="%Y-%m-%d %H:%M:%S"):
        """
        时间字符串转时间戳
        :param time_str: 时间字符串
        :param format_str: 格式字符串
        返回：int，例如：1636969800
        """
        time_array = time.strptime(time_str, format_str)
        return int(time.mktime(time_array))

    @staticmethod
    def get_time_difference(start_time, end_time=None, format_str="%Y-%m-%d %H:%M:%S"):
        """
        计算两个时间的差值（秒）
        :param start_time: 开始时间（字符串或datetime对象）
        :param end_time: 结束时间（字符串或datetime对象），默认为当前时间
        :param format_str: 当参数为字符串时的格式
        返回：timedelta对象
        """
        if isinstance(start_time, str):
            start_time = datetime.datetime.strptime(start_time, format_str)
        if end_time is None:
            end_time = datetime.datetime.now()
        elif isinstance(end_time, str):
            end_time = datetime.datetime.strptime(end_time, format_str)

        return end_time - start_time


# 使用示例
if __name__ == "__main__":
    print("当前时间（年-月-日-时-分）：", TimeUtils.get_current_time())
    print("当前时间和星期：", TimeUtils.get_current_time_with_weekday())
    print("当前时间戳：", TimeUtils.get_timestamp())
    print("格式化当前时间：", TimeUtils.get_formatted_time())

    time_str = "2023-11-15 14:30:00"
    print(f"'{time_str}' 转时间戳：", TimeUtils.time_str_to_timestamp(time_str))

    start_time = "2023-11-15 14:30:00"
    print(f"从 '{start_time}' 到现在的时间差：", TimeUtils.get_time_difference(start_time))
