"""
中文字段标准化映射
用于将各种变体的中文字段名标准化为统一的中文名
"""


PROFIT_STATEMENT_MAPPING = {
    # 营业收入相关
    "其中：营业收入": "营业收入",
    "一、营业收入": "营业收入",
    "营业收入": "营业收入",
    
    # 营业成本相关
    "其中：营业成本": "营业成本",
    "减：营业成本": "营业成本",
    "营业成本": "营业成本",
    
    # 营业利润相关
    '二、营业利润（亏损以"－"号填列）': "营业利润",
    '二、营业利润（亏损以“－”号填列）': "营业利润",
    '营业利润（亏损以"－"号填列）': "营业利润",
    '营业利润（亏损以“－”号填列）': "营业利润",
    "营业利润": "营业利润",
    
    # 利润总额相关
    '三、利润总额（亏损总额以"－"号填列）': "利润总额",
    '三、利润总额（亏损总额以“－”号填列）': "利润总额",
    '利润总额（亏损总额以"－"号填列）': "利润总额",
    '利润总额（亏损总额以“－”号填列）': "利润总额",
    "利润总额": "利润总额",
    
    # 净利润相关
    '四、净利润（净亏损以"－"号填列）': "净利润",
    '四、净利润（净亏损以“－”号填列）': "净利润",
    '五、净利润（净亏损以"－"号填列）': "净利润",
    '五、净利润（净亏损以“－”号填列）': "净利润",
    '净利润（净亏损以"－"号填列）': "净利润",
    '净利润（净亏损以“－”号填列）': "净利润",
    "净利润": "净利润",
    
    # 税金及附加相关
    "营业税金及附加": "税金及附加",
    "税金及附加": "税金及附加",
    
    # 销售费用相关
    "销售费用": "销售费用",
    
    # 管理费用相关
    "管理费用": "管理费用",
    
    # 研发费用相关
    "研发费用": "研发费用",
    
    # 财务费用相关
    "财务费用": "财务费用",
    
    # 利息费用相关
    "其中：利息费用": "利息费用",
    "利息费用": "利息费用",
    
    # 利息收入相关
    "利息收入": "利息收入",
    
    # 投资收益相关
    '投资收益（损失以"－"号填列）': "投资收益",
    '投资收益（损失以“－”号填列）': "投资收益",
    "投资收益": "投资收益",
    
    # 公允价值变动收益相关
    '公允价值变动收益（损失以"－"号填列）': "公允价值变动收益",
    '公允价值变动收益（损失以“－”号填列）': "公允价值变动收益",
    "加：公允价值变动收益": "公允价值变动收益",
    "公允价值变动收益": "公允价值变动收益",
    
    # 信用减值损失相关
    '信用减值损失（损失以"－"号填列）': "信用减值损失",
    '信用减值损失（损失以“－”号填列）': "信用减值损失",
    '信用减值损失（损失以“-”号填列）': "信用减值损失",
    "信用减值损失": "信用减值损失",
    
    # 资产减值损失相关
    '资产减值损失（损失以"－"号填列）': "资产减值损失",
    '资产减值损失（损失以“－”号填列）': "资产减值损失",
    "资产减值损失": "资产减值损失",
    
    # 资产处置收益相关
    '资产处置收益（损失以"－"号填列）': "资产处置收益",
    '资产处置收益（损失以“－”号填列）': "资产处置收益",
    "资产处置收益": "资产处置收益",
    
    # 营业利润相关（扩展）
    '二、营业利润（亏损以“－”号填列）': "营业利润",
    '营业利润（亏损以“－”号填列）': "营业利润",
    "营业利润": "营业利润",
    
    # 利润总额相关（扩展）
    '三、利润总额（亏损总额以“－”号填列）': "利润总额",
    '利润总额（亏损总额以“－”号填列）': "利润总额",
    "利润总额": "利润总额",
    

    
    # 其他收益相关
    "加：其他收益": "其他收益",
    "其他收益": "其他收益",
    
    # 营业外收入相关
    "加：营业外收入": "营业外收入",
    "营业外收入": "营业外收入",
    
    # 营业外支出相关
    "减：营业外支出": "营业外支出",
    "营业外支出": "营业外支出",
    
    # 所得税费用相关
    "减：所得税费用": "所得税费用",
    "所得税费用": "所得税费用",
    
    # 基本每股收益相关
    "（一）基本每股收益(元/股)": "基本每股收益",
    "基本每股收益(元/股)": "基本每股收益",
    "基本每股收益": "基本每股收益",
    
    # 稀释每股收益相关
    "（二）稀释每股收益(元/股)": "稀释每股收益",
    "稀释每股收益(元/股)": "稀释每股收益",
    "稀释每股收益": "稀释每股收益"
}

BALANCE_SHEET_MAPPING = {
    # 资产负债表相关
    "流动资产：": "流动资产",
    "流动资产": "流动资产",
    
    "非流动资产：": "非流动资产",
    "非流动资产": "非流动资产",
    
    "流动负债：": "流动负债",
    "流动负债": "流动负债",
    
    "非流动负债：": "非流动负债",
    "非流动负债": "非流动负债",
    
    "所有者权益（或股东权益）：": "所有者权益",
    "所有者权益（或股东权益）": "所有者权益",
    "所有者权益": "所有者权益",
    
    # 流动资产
    "流动资产合计": "流动资产合计",
    "货币资金": "货币资金",
    "交易性金融资产": "交易性金融资产",
    "衍生金融资产": "衍生金融资产",
    "应收票据": "应收票据",
    "应收账款": "应收账款",
    "应收款项融资": "应收款项融资",
    "预付款项": "预付款项",
    "其他应收款": "其他应收款",
    "存货": "存货",
    "合同资产": "合同资产",
    "持有待售资产": "持有待售资产",
    "一年内到期的非流动资产": "一年内到期的非流动资产",
    "其他流动资产": "其他流动资产",
    
    # 非流动资产
    "非流动资产合计": "非流动资产合计",
    "发放贷款和垫款": "发放贷款和垫款",
    "债权投资": "债权投资",
    "其他债权投资": "其他债权投资",
    "长期股权投资": "长期股权投资",
    "其他权益工具投资": "其他权益工具投资",
    "其他非流动金融资产": "其他非流动金融资产",
    "投资性房地产": "投资性房地产",
    "固定资产": "固定资产",
    "在建工程": "在建工程",
    "生产性生物资产": "生产性生物资产",
    "油气资产": "油气资产",
    "使用权资产": "使用权资产",
    "无形资产": "无形资产",
    "开发支出": "开发支出",
    "商誉": "商誉",
    "长期待摊费用": "长期待摊费用",
    "递延所得税资产": "递延所得税资产",
    "其他非流动资产": "其他非流动资产",
    
    # 资产总计
    "资产合计": "资产总计",
    "*资产合计": "资产总计",
    "资产总计": "资产总计",
    
    # 流动负债
    "流动负债合计": "流动负债合计",
    "短期借款": "短期借款",
    "交易性金融负债": "交易性金融负债",
    "衍生金融负债": "衍生金融负债",
    "应付票据": "应付票据",
    "应付账款": "应付账款",
    "合同负债": "合同负债",
    "预收款项": "预收款项",
    "应付职工薪酬": "应付职工薪酬",
    "应交税费": "应交税费",
    "其他应付款": "其他应付款",
    "持有待售负债": "持有待售负债",
    "一年内到期的非流动负债": "一年内到期的非流动负债",
    "其他流动负债": "其他流动负债",
    
    # 非流动负债
    "非流动负债合计": "非流动负债合计",
    "长期借款": "长期借款",
    "应付债券": "应付债券",
    "租赁负债": "租赁负债",
    "长期应付款": "长期应付款",
    "长期应付职工薪酬": "长期应付职工薪酬",
    "预计负债": "预计负债",
    "递延收益": "递延收益",
    "递延所得税负债": "递延所得税负债",
    "其他非流动负债": "其他非流动负债",
    
    # 负债总计
    "负债合计": "负债合计",
    "*负债合计": "负债合计",
    
    # 所有者权益
    "所有者权益合计": "所有者权益合计",
    "股本": "股本",
    "实收资本（或股本）": "实收资本",
    "实收资本": "实收资本",
    "资本公积": "资本公积",
    "其他综合收益": "其他综合收益",
    "专项储备": "专项储备",
    "盈余公积": "盈余公积",
    "未分配利润": "未分配利润",
    "归属于母公司所有者权益合计": "归属于母公司所有者权益合计",
    "少数股东权益": "少数股东权益",
    
    # 其他权益工具相关
    "其他权益工具": "其他权益工具",
    
    # 库存股相关
    "减：库存股": "库存股",
    "库存股": "库存股",
    
    # 所有者权益合计相关
    "所有者权益（或股东权益）合计": "所有者权益合计",
    "归属于母公司所有者权益（或股东权益）合计": "所有者权益合计",
    
    # 负债和所有者权益总计
    "负债和所有者权益合计": "负债和所有者权益总计",
    "负债和所有者权益（或股东权益）合计": "负债和所有者权益总计",
    "负债和所有者权益（或股东权益）总计": "负债和所有者权益总计",
    "*所有者权益（或股东权益）合计": "所有者权益合计",
    "所有者权益（或股东权益）合计": "所有者权益合计",
    "负债和所有者权益（或股东权益）合计": "负债和所有者权益总计"
}


CASH_FLOW_STATEMENT_MAPPING = {
    "科目": "项目",
    "项目": "项目",
    
    # 经营活动现金流量相关
    "经营活动产生的现金流量净额": "经营活动产生的现金流量净额",
    "*经营活动产生的现金流量净额": "经营活动产生的现金流量净额",
    
    # 经营活动现金流入
    "销售商品、提供劳务收到的现金": "销售商品、提供劳务收到的现金",
    "收到的税费返还": "收到的税费返还",
    "收到其他与经营活动有关的现金": "收到其他与经营活动有关的现金",
    "经营活动现金流入小计": "经营活动现金流入小计",
    
    # 经营活动现金流出
    "购买商品、接受劳务支付的现金": "购买商品、接受劳务支付的现金",
    "支付给职工以及为职工支付的现金": "支付给职工以及为职工支付的现金",
    "支付的各项税费": "支付的各项税费",
    "支付其他与经营活动有关的现金": "支付其他与经营活动有关的现金",
    "经营活动现金流出小计": "经营活动现金流出小计",
    
    # 投资活动现金流量相关
    "投资活动产生的现金流量净额": "投资活动产生的现金流量净额",
    "*投资活动产生的现金流量净额": "投资活动产生的现金流量净额",
    
    # 投资活动现金流入
    "取得投资收益收到的现金": "取得投资收益收到的现金",
    "处置固定资产、无形资产和其他长期资产收回的现金净额": "处置固定资产、无形资产和其他长期资产收回的现金净额",
    "处置子公司及其他营业单位收到的现金净额": "处置子公司及其他营业单位收到的现金净额",
    "收到其他与投资活动有关的现金": "收到其他与投资活动有关的现金",
    "投资活动现金流入小计": "投资活动现金流入小计",
    
    # 投资活动现金流出
    "购建固定资产、无形资产和其他长期资产支付的现金": "购建固定资产、无形资产和其他长期资产支付的现金",
    "投资支付的现金": "投资支付的现金",
    "取得子公司及其他营业单位支付的现金净额": "取得子公司及其他营业单位支付的现金净额",
    "支付其他与投资活动有关的现金": "支付其他与投资活动有关的现金",
    "投资活动现金流出小计": "投资活动现金流出小计",
    
    # 筹资活动现金流量相关
    "筹资活动产生的现金流量净额": "筹资活动产生的现金流量净额",
    "*筹资活动产生的现金流量净额": "筹资活动产生的现金流量净额",
    
    # 筹资活动现金流入
    "吸收投资收到的现金": "吸收投资收到的现金",
    "取得借款收到的现金": "取得借款收到的现金",
    "收到其他与筹资活动有关的现金": "收到其他与筹资活动有关的现金",
    "筹资活动现金流入小计": "筹资活动现金流入小计",
    
    # 筹资活动现金流出
    "偿还债务支付的现金": "偿还债务支付的现金",
    "分配股利、利润或偿付利息支付的现金": "分配股利、利润或偿付利息支付的现金",
    "支付其他与筹资活动有关的现金": "支付其他与筹资活动有关的现金",
    "筹资活动现金流出小计": "筹资活动现金流出小计",
    
    # 汇率变动对现金及现金等价物的影响
    "汇率变动对现金及现金等价物的影响": "汇率变动对现金及现金等价物的影响",
    
    # 现金及现金等价物净增加额
    "现金及现金等价物净增加额": "现金及现金等价物净增加额",
    "*现金及现金等价物净增加额": "现金及现金等价物净增加额",
    
    # 期初现金及现金等价物余额
    "期初现金及现金等价物余额": "期初现金及现金等价物余额",
    
    # 期末现金及现金等价物余额
    "期末现金及现金等价物余额": "期末现金及现金等价物余额",
    
    # 补充资料 - 净利润调节为经营活动现金流量
    "净利润": "净利润",
    "资产减值准备": "资产减值准备",
    "固定资产折旧": "固定资产折旧",
    "无形资产摊销": "无形资产摊销",
    "长期待摊费用摊销": "长期待摊费用摊销",
    "处置固定资产、无形资产和其他长期资产的损失": "处置固定资产、无形资产和其他长期资产的损失",
    "固定资产报废损失": "固定资产报废损失",
    "公允价值变动损失": "公允价值变动损失",
    "财务费用": "财务费用",
    "投资损失": "投资损失",
    "递延所得税资产减少": "递延所得税资产减少",
    "递延所得税负债增加": "递延所得税负债增加",
    "存货的减少": "存货的减少",
    "经营性应收项目的减少": "经营性应收项目的减少",
    "经营性应付项目的增加": "经营性应付项目的增加",
    "其他": "其他",
    "经营活动产生的现金流量净额(调整后)": "经营活动产生的现金流量净额(调整后)",
    
    # 现金及现金等价物变动情况
    "现金的期末余额": "现金的期末余额",
    "现金等价物的期末余额": "现金等价物的期末余额",
    "减：现金等价物的期初余额": "减：现金等价物的期初余额",
    "现金及现金等价物净增加额(调整后)": "现金及现金等价物净增加额(调整后)",
    "间接法-现金及现金等价物净增加额": "间接法-现金及现金等价物净增加额",

    # 银行类金融机构特有字段
    "客户存款和同业存放款项净增加额": "客户存款和同业存放款项净增加额",
    "向中央银行借款净增加额": "向中央银行借款净增加额",
    "拆入资金净增加额": "拆入资金净增加额",
    "拆出资金净减少额": "拆出资金净减少额",
    "存放中央银行和同业款项净减少额": "存放中央银行和同业款项净减少额",
    "发放贷款和垫款净增加额": "发放贷款和垫款净增加额",
    "收回投资收到的现金": "收回投资收到的现金",
    "发行债券收到的现金": "发行债券收到的现金"
}


# 中文字段标准化映射字典
# 格式: {变体字段名: 标准字段名}
CHINESE_FIELD_NORMALIZATION = {
    **PROFIT_STATEMENT_MAPPING,
    **BALANCE_SHEET_MAPPING,
    **CASH_FLOW_STATEMENT_MAPPING
}

def normalize_chinese_field(field_name: str) -> str:
    """
    将中文字段名标准化
    
    Args:
        field_name: 原始中文字段名
        
    Returns:
        标准化后的中文字段名
    """
    
    if not field_name:
        return field_name
    
    # 去除首尾空格
    field_name = field_name.strip()
    field_name = field_name.replace('\n', '')
    
    # 去除括号及其内容
    field_name = remove_brackets_content(field_name)
    
    # 去除中文数字前缀
    field_name = remove_chinese_number_prefix(field_name)
    
    # 查找标准化映射
    normalized_name = CHINESE_FIELD_NORMALIZATION.get(field_name, field_name)

    return normalized_name

def remove_chinese_number_prefix(field_name: str) -> str:
    """
    去除字段名中的中文数字前缀
    
    Args:
        field_name: 原始字段名
        
    Returns:
        去除中文数字前缀后的字段名
    """
    if not field_name:
        return field_name
    
    # 中文数字映射
    chinese_numbers = {
        '一': '1', '二': '2', '三': '3', '四': '4', '五': '5',
        '六': '6', '七': '7', '八': '8', '九': '9', '十': '10',
        '十一': '11', '十二': '12', '十三': '13', '十四': '14', '十五': '15',
        '十六': '16', '十七': '17', '十八': '18', '十九': '19', '二十': '20'
    }
    
    # 匹配模式：以中文数字开头，后面跟着"、"或"）"或"."
    import re
    
    # 匹配模式1：中文数字 + "、" 或 "）" 或 "." 或 "、"
    pattern1 = r'^[一二三四五六七八九十]+[、）\.]'
    
    # 匹配模式2：括号内的中文数字 + "）"
    pattern2 = r'^（[一二三四五六七八九十]+）'
    
    # 匹配模式3：中文数字 + "、" + 可能的空格
    pattern3 = r'^[一二三四五六七八九十]+、\s*'
    
    # 尝试匹配并去除
    if re.match(pattern1, field_name):
        # 找到第一个非中文数字、非标点符号的位置
        for i, char in enumerate(field_name):
            if char not in chinese_numbers and char not in ['、', '）', '.', '，']:
                return field_name[i:].strip()
    
    elif re.match(pattern2, field_name):
        # 找到右括号后的位置
        right_bracket_pos = field_name.find('）')
        if right_bracket_pos != -1:
            return field_name[right_bracket_pos + 1:].strip()
    
    elif re.match(pattern3, field_name):
        # 找到顿号后的位置
        comma_pos = field_name.find('、')
        if comma_pos != -1:
            return field_name[comma_pos + 1:].strip()
    
    return field_name

def remove_brackets_content(field_name: str) -> str:
    """
    去除字段名中的括号及其内容
    
    Args:
        field_name: 原始字段名
        
    Returns:
        去除括号内容后的字段名
    """
    if not field_name:
        return field_name
    
    import re
    
    # 去除中文括号及其内容
    # 匹配中文括号：（）及其内容
    field_name = re.sub(r'（[^）]*）', '', field_name)
    
    # 去除英文括号及其内容
    # 匹配英文括号：()及其内容
    field_name = re.sub(r'\([^)]*\)', '', field_name)
    
    # 去除方括号及其内容
    # 匹配方括号：[]及其内容
    field_name = re.sub(r'\[[^\]]*\]', '', field_name)
    
    # 去除花括号及其内容
    # 匹配花括号：{}及其内容
    field_name = re.sub(r'\{[^}]*\}', '', field_name)
    
    # 去除多余的空格
    field_name = re.sub(r'\s+', ' ', field_name).strip()
    
    return field_name

def get_all_variants(standard_name: str) -> list:
    """
    获取标准字段名的所有变体
    
    Args:
        standard_name: 标准字段名
        
    Returns:
        所有变体字段名的列表
    """
    variants = []
    for variant, standard in CHINESE_FIELD_NORMALIZATION.items():
        if standard == standard_name:
            variants.append(variant)
    
    return variants

def get_standard_fields() -> set:
    """
    获取所有标准字段名
    
    Returns:
        标准字段名集合
    """
    return set(CHINESE_FIELD_NORMALIZATION.values())

def add_normalization_mapping(variant: str, standard: str):
    """
    添加新的标准化映射
    
    Args:
        variant: 变体字段名
        standard: 标准字段名
    """
    CHINESE_FIELD_NORMALIZATION[variant] = standard 