import datetime
import re


def format_chinese_date(date_str):
    """
    将包含中文字符的日期字符串格式化为标准的 'YYYY-MM-DD HH:MM:SS' 格式。

    参数:
        date_str (str): 输入的中文日期字符串，例如 "20 19 年7 月18日 09： 30整"

    返回:
        str: 格式化后的日期字符串，例如 "2019-07-18 09:30:00"
        如果格式错误，返回 None 并打印错误信息。
    """
    # 检查输入类型
    if not isinstance(date_str, str):
        print(f"输入类型错误: 期望字符串类型，实际类型为 {type(date_str)}")
        return None

    # print("------------")
    # print(f"原始输入: {date_str}")
        # 预处理：删除第一个数字之前的所有字符
    date_str = re.sub(r'^[^\d]*', '', date_str)
    # 1. 删除所有空格
    date_str = ''.join(date_str.split())

    # 1.5 删除括号及其内容（中文括号）
    date_str = re.sub(r'（.*?）', '', date_str)

    # 2. 使用正则表达式移除所有非数字和非必要的中文字符
    # 只保留数字、年、月、日、时、分、秒、冒号、减号
    date_str = re.sub(r'[^\d年月日时分秒点:：\-]', '', date_str)

    # print(f"去除多余字符后: {date_str}")

    # 3. 替换全角冒号为半角冒号
    date_str = date_str.replace('：', ':')

    # 4. 替换'年'和'月'为 '-', '日'为 ' '，确保日期和时间之间有一个空格
    date_str = date_str.replace('年', '-').replace('月', '-').replace('日', ' ')
    # 替换'时'、'分'为 ':'，并移除'秒'
    date_str = date_str.replace('时', ':').replace('点',':').replace('分', ':').replace('秒', '')

    # print(f"替换分隔符后: {date_str}")

    # 5. 处理时间部分
    if ' ' not in date_str:
        # 如果没有时间部分，添加默认时间
        date_str += ' 00:00:00'
    else:
        # 分割日期和时间部分
        parts = date_str.split(' ', 1)
        if len(parts) != 2:
            # Unexpected format
            print(f"日期格式错误: 分割后部分数不正确 - {date_str}")
            return None
        date_part, time_part = parts

        if not time_part:
            # 时间部分为空，设置为默认时间
            time_part = '00:00:00'
        else:
            # 如果时间部分只有小时和分钟，添加秒
            time_components = time_part.split(':')
            if len(time_components) == 1:
                # 只有小时
                time_part = f"{time_components[0]:0>2}:00:00"
            elif len(time_components) == 2:
                # 小时和分钟
                time_part = f"{time_components[0]:0>2}:{time_components[1]:0>2}:00"
            elif len(time_components) == 3:
                # 小时、分钟和秒
                time_part = f"{time_components[0]:0>2}:{time_components[1]:0>2}:{time_components[2]:0>2}"
            else:
                # 超过3个部分，格式错误
                print(f"日期格式错误: 时间部分格式不正确 - {time_part}")
                return None

        # 补齐日期部分中的月和日为双数字
        date_parts = date_part.split('-')
        if len(date_parts) != 3:
            print(f"日期格式错误: 日期部分格式不正确 - {date_part}")
            return None
        year, month, day = date_parts
        month = month.zfill(2)
        day = day.zfill(2)
        date_part = f"{year}-{month}-{day}"

        date_str = f"{date_part} {time_part}"

    # print(f"最终处理后字符串: {date_str}")

    # 6. 定义输入字符串的格式
    input_format = "%Y-%m-%d %H:%M:%S"

    try:
        # 解析字符串为 datetime 对象
        dt = datetime.datetime.strptime(date_str, input_format)

        # 格式化为所需的输出格式
        formatted_date = dt.strftime("%Y-%m-%d %H:%M:%S")
        return formatted_date
    except ValueError as e:
        print(f"日期格式错误: {e} - 处理后的字符串: '{date_str}'")
        return None


# 示例使用
if __name__ == "__main__":
    input_dates = [
        # 完整的日期和时间
        "2022 年 8 月 18 日 下午 16 :0 0",
        "2019年7月18日09：30",
        "20 19 年7 月18日 09： 30整（北京时间）",
        "2020年02月05日12时30分45秒",
        "2021年3月15日16:45:30",
        "2022年6月30日23时59分59秒",
        "2023年01月01日00时00分00秒",
        "2024年12月31日23:59:59",

        # 仅有日期，没有时间
        "2020年12月5日",
        "2021年5月1日",
        "2022年02月29日",  # 闰年
        "2023年04月31日",  # 无效日期
        "2021年13月1日",  # 无效月份
        "2021年00月10日",  # 无效月份
        "2021年05月00日",  # 无效日期
        "2021年05月32日",  # 无效日期

        # 日期和部分时间
        "2020年2月5日12时",
        "2020年2月5日12时30分",
        "2021年3月15日16:",
        "2023年01月01日00：00",
        "2021年5月1日07时5分5秒",
        "2021年5月1日07:5:5",

        # 带有不同中文字符和额外内容
        "2020年02月05日12:30整",
        "2021年3月15日16:45（上午）",
        "2022年6月30日23:59:59（夜间）",
        "2023年01月01日00:00（凌晨）",
        "2024年02月29日00:00:00（闰年）",

        # 不同的时间表示方式
        "2022年6月30日23：59：59",
        "2023年01月01日00：00",
        "2021年3月15日16时45分",
        "2020年02月05日12：30：45",

        # 无效的日期字符串
        "无效日期字符串",
        "2021年5月1日25时00分00秒",  # 无效小时
        "2021年5月1日23时60分00秒",  # 无效分钟
        "2021年5月1日23时59分60秒",  # 无效秒
    ]

    for input_date in input_dates:
        formatted = format_chinese_date(input_date)
        print(type(formatted))
        print(f"原始输入: {input_date} -> 格式化后: {formatted}\n")
        if not formatted:
            print("error!")
