#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
VWED.system_thread 模块 - 系统线程和时间相关功能
"""

import time
import asyncio
from datetime import datetime
from utils.logger import get_logger


class VWEDSystemThreadModule:
    """VWED.system_thread 模块 - 多线程及时间管理"""
    
    def __init__(self, script_id: str):
        self.script_id = script_id
        self.logger = get_logger(f"services.online_script.system_thread_module.{script_id}")
    
    async def sleep(self, ms: int) -> None:
        """休眠指定时间
        
        本方法是异步方法，使当前协程休眠指定时间，不会阻塞整个系统。
        
        Args:
            ms: 休眠的时间，单位毫秒
            
        Returns:
            None
        """
        try:
            if ms < 0:
                self.logger.warning(f"[{self.script_id}] 休眠时间不能为负数: {ms}")
                return
            
            # 将毫秒转换为秒
            sleep_seconds = ms / 1000.0
            await asyncio.sleep(sleep_seconds)
            
            self.logger.debug(f"[{self.script_id}] 休眠完成: {ms}ms")
            
        except Exception as e:
            self.logger.error(f"[{self.script_id}] 休眠失败: {e}")
    
    def current_time_millis(self) -> int:
        """获取当前系统时间戳
        
        获取当前的系统时间戳。
        
        Returns:
            int: 当前系统的毫秒时间戳
        """
        try:
            # 获取当前时间的毫秒时间戳
            current_time = int(time.time() * 1000)
            
            self.logger.debug(f"[{self.script_id}] 获取当前时间戳: {current_time}")
            return current_time
            
        except Exception as e:
            self.logger.error(f"[{self.script_id}] 获取时间戳失败: {e}")
            # 返回一个默认值，避免脚本异常
            return int(time.time() * 1000)
    
    def now_date(self) -> str:
        """获取当前时间
        
        获取当前系统的格式化时间。
        
        Returns:
            str: 按照 yyyy-MM-dd HH:mm:ss 格式的时间字符串
        """
        try:
            # 获取当前时间并格式化
            current_time = datetime.now()
            formatted_time = current_time.strftime("%Y-%m-%d %H:%M:%S")
            
            self.logger.debug(f"[{self.script_id}] 获取当前格式化时间: {formatted_time}")
            return formatted_time
            
        except Exception as e:
            self.logger.error(f"[{self.script_id}] 获取格式化时间失败: {e}")
            # 返回一个默认格式的时间
            return datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    
    def time_millis_format(self, time_millis: int) -> str:
        """将时间戳转为日期格式
        
        将时间戳转为格式化的日期时间。
        
        Args:
            time_millis: 毫秒时间戳
            
        Returns:
            str: 按照 yyyy-MM-dd HH:mm:ss 格式的时间字符串
            
        Raises:
            Exception: 当时间戳格式错误或转换失败时抛出异常
        """
        try:
            if not isinstance(time_millis, int):
                raise ValueError(f"时间戳必须是整数类型，当前类型: {type(time_millis)}")
            
            if time_millis < 0:
                raise ValueError(f"时间戳不能为负数: {time_millis}")
            
            # 将毫秒时间戳转换为秒
            time_seconds = time_millis / 1000.0
            
            # 转换为datetime对象并格式化
            dt = datetime.fromtimestamp(time_seconds)
            formatted_time = dt.strftime("%Y-%m-%d %H:%M:%S")
            
            self.logger.debug(f"[{self.script_id}] 时间戳转换: {time_millis} -> {formatted_time}")
            return formatted_time
            
        except ValueError as e:
            self.logger.error(f"[{self.script_id}] 时间戳格式错误: {e}")
            raise e
        except OSError as e:
            # 处理时间戳超出系统范围的情况
            self.logger.error(f"[{self.script_id}] 时间戳超出范围: {e}")
            raise Exception(f"时间戳超出系统支持范围: {time_millis}")
        except Exception as e:
            self.logger.error(f"[{self.script_id}] 时间戳转换失败: {e}")
            raise Exception(f"时间戳转换失败: {e}")