
import os
import re
from datetime import datetime, timedelta
from pathlib import Path
from random import randint
from typing import Any, List, Literal, Optional, Tuple


_STR_DIGITAL_MAP = {
    'k': 1e3,
    '千': 1e3,
    'w': 1e4,
    '万': 1e4,
    '亿': 1e8,
}

def get_root_dir() -> str:
    """获取项目根目录的绝对路径"""
    current_path = Path(__file__).resolve()
    root_path = current_path.parent if not current_path.is_dir() else current_path
    while True:
        if 'requirements.txt' in os.listdir(root_path):
            return str(root_path.absolute())
        root_path = root_path.parent


def get_abs_path(relative_path: str) -> str:
    """获取目标文件或目录的相对路径在系统中的绝对路径"""
    return os.path.join(get_root_dir(), relative_path)




def get_now_ts(length: Literal[10, 13] = 13) -> int:
    """获取当前时间的10位或13位时间戳"""
    now_ts = datetime.now().timestamp()
    if length == 10:
        return int(now_ts)
    else:
        return int(now_ts * 1000)


def pascal_to_snake(pascal_str: str) -> str:
    """将Pascal字符串转为蛇形字符串"""
    snake_str = re.sub(r'([a-z])([A-Z])', r'\1_\2', pascal_str)
    return snake_str.lower()


def snake_to_pascal(snake_str: str) -> str:
    """将蛇形字符串转为Pascal字符串"""
    return ''.join([item.title() for item in snake_str.split('_')])


def generate_task_id():
    """生成task_id"""
    now = datetime.now().strftime('%Y%m%d%H%M%S%f')[:-3]
    return f'{now}{randint(100000, 999999)}'


def get_x_day_ago_timestamp(x_days_ago: int = 0, length: Literal[13, 10] = 13):
    now = datetime.now()
    yesterday = now - timedelta(days=x_days_ago)
    yesterday_midnight = yesterday.replace(hour=0, minute=0, second=0, microsecond=0)
    if length == 10:
        return int(yesterday_midnight.timestamp())
    else:
        return int(yesterday_midnight.timestamp() * 1000)


def get_file_size(file_path):
    with open(file_path, 'rb') as f:
        return len(f.read())


def cookie_str_to_json(cookie: str) -> dict:
    components = cookie.strip().split(';')
    short_parsed_request = {component.split('=')[0].strip(): component.split('=')[1].strip() for component in components if
                            '=' in component}
    return short_parsed_request

def get_day_timestamp(day):
    now = datetime.now()
    yesterday = now - timedelta(days=day)
    yesterday_midnight = yesterday.replace(hour=0, minute=0, second=0, microsecond=0)
    timestamp_yesterday_midnight_ms = int(yesterday_midnight.timestamp())

    return timestamp_yesterday_midnight_ms


def str_digital_to_int(v: str) -> int:
    """将带有+、k、w字符的数据类字符串转为int"""
    v = v.rstrip('+')
    unit = v[-1]
    if unit in _STR_DIGITAL_MAP:
        v = float(v.rstrip(unit)) * _STR_DIGITAL_MAP[unit]
    else:
        v = float(v)
    return int(v)

def datetime_to_timestamp(time_str:str):
    dt = datetime.strptime(time_str, "%Y-%m-%d %H:%M:%S")
    # 转换为时间戳
    timestamp = int(dt.timestamp())*1000
    return timestamp

if __name__ == '__main__':
    print(datetime_to_timestamp("2024-10-30 19:05:56"))
