"""从县区级地名精确推断省份，重新分类通用分组"""
import json, re, os

CONFIG_PATH = "/root/gov_crawler/daily_crawl_config.json"
BACKUP_DIR = "/root/gov_crawler/backups"

CNTY_TO_PROV = {
    # 内蒙古
    "准格尔旗": "内蒙古", "乌拉特前旗": "内蒙古", "乌拉特后旗": "内蒙古",
    "满洲里市": "内蒙古", "呼和浩特市": "内蒙古",
    "乌海市": "内蒙古", "乌达区": "内蒙古",
    "武川县": "内蒙古", "托克托县": "内蒙古",
    "九原区": "内蒙古",
    "科尔沁区": "内蒙古", "科尔沁左翼": "内蒙古",
    "额济纳旗": "内蒙古", "阿拉善": "内蒙古",
    # 新疆
    "高昌区": "新疆", "新星市": "新疆", "双河市": "新疆",
    "五家渠市": "新疆", "石河子市": "新疆",
    "新和县": "新疆", "阿克苏": "新疆",
    "铁门关市": "新疆",
    # 云南
    "永平县": "云南", "祥云县": "云南", "丽江": "云南",
    "古城区": "云南", "文山州": "云南", "南华县": "云南",
    "沾益区": "云南", "富源县": "云南",
    "永仁县": "云南", "彝良县": "云南",
    "勐海县": "云南", "澜沧县": "云南",
    # 四川
    "涪城区": "四川", "安州区": "四川", "游仙区": "四川",
    "犍为县": "四川", "罗江区": "四川", "旌阳区": "四川",
    "叙州区": "四川", "筠连县": "四川",
    "米易县": "四川", "仁和区": "四川",
    "大安区": "四川", "沿滩区": "四川",
    "仪陇县": "四川", "南部县": "四川",
    "宣汉县": "四川", "大竹县": "四川",
    "乐山市": "四川", "五通桥区": "四川",
    "广安市": "四川", "广安": "四川",
    "宜宾市": "四川", "宜宾": "四川",
    "绵阳": "四川", "德阳市": "四川", "德阳": "四川",
    "泸州市": "四川", "眉山市": "四川",
    # 山西
    "稷山县": "山西", "绛县": "山西", "夏县": "山西", "闻喜县": "山西",
    "永济市": "山西", "河津市": "山西", "万荣县": "山西",
    "新绛县": "山西", "临猗县": "山西", "垣曲县": "山西",
    "平陆县": "山西", "芮城县": "山西",
    "清徐县": "山西", "阳曲县": "山西",
    "榆社县": "山西", "左权县": "山西", "和顺县": "山西",
    "忻州市": "山西", "原平市": "山西",
    "朔州市": "山西", "应县": "山西",
    # 湖南
    "湘潭县": "湖南", "湘乡市": "湖南",
    "汨罗市": "湖南", "平江县": "湖南", "湘阴县": "湖南",
    "沅江市": "湖南", "南县": "湖南", "桃江县": "湖南",
    "醴陵市": "湖南", "攸县": "湖南",
    "耒阳市": "湖南", "常宁市": "湖南",
    "绥宁县": "湖南", "洞口县": "湖南",
    "新化县": "湖南",
    # 贵州
    "习水县": "贵州", "赤水市": "贵州",
    "思南县": "贵州", "德江县": "贵州",
    "纳雍县": "贵州", "威宁县": "贵州",
    "贵阳市": "贵州", "息烽县": "贵州", "开阳县": "贵州",
    "黔东南": "贵州", "黔南": "贵州", "黔西南": "贵州",
    "麻江县": "贵州", "湄潭县": "贵州",
    "福泉市": "贵州", "铜仁市": "贵州",
    # 江西
    "赣州市": "江西", "赣县区": "江西", "南康区": "江西", "章贡区": "江西",
    "余江区": "江西", "月湖区": "江西",
    "永修县": "江西", "彭泽县": "江西", "德安县": "江西",
    "金溪县": "江西", "南城县": "江西",
    "吉州区": "江西", "青原区": "江西",
    "袁州区": "江西", "丰城市": "江西", "高安市": "江西",
    # 湖北
    "掇刀区": "湖北",
    "黄冈市": "湖北",
    "大悟县": "湖北", "孝昌县": "湖北",
    "潜江市": "湖北", "仙桃市": "湖北", "天门市": "湖北",
    "嘉鱼县": "湖北", "赤壁市": "湖北", "通城县": "湖北",
    "阳新县": "湖北", "大冶市": "湖北",
    "松滋市": "湖北", "公安县": "湖北", "石首市": "湖北",
    "云梦县": "湖北",
    # 河南
    "禹王台区": "河南",
    "潢川县": "河南", "淮滨县": "河南",
    "濮阳县": "河南", "清丰县": "河南",
    "郾城区": "河南", "召陵区": "河南",
    "方城县": "河南", "社旗县": "河南",
    "商水县": "河南", "扶沟县": "河南",
    "新乡市": "河南", "卫辉市": "河南", "辉县市": "河南",
    "许昌市": "河南", "长葛市": "河南", "建安区": "河南",
    # 陕西
    "榆林市": "陕西", "神木市": "陕西",
    "志丹县": "陕西", "吴起县": "陕西",
    "黄陵县": "陕西", "宜川县": "陕西",
    "渭南市": "陕西",
    # 河北
    "河间市": "河北", "任丘市": "河北",
    "枣强县": "河北", "武邑县": "河北",
    # 甘肃
    "金昌市": "甘肃", "永昌县": "甘肃",
    "宕昌县": "甘肃", "成县": "甘肃",
    "甘州区": "甘肃",
    "凉州区": "甘肃", "民勤县": "甘肃",
    "白银市": "甘肃",
    # 广西
    "融水": "广西",
    "兴宾区": "广西", "象州县": "广西",
    # 辽宁
    "营口市": "辽宁", "大石桥市": "辽宁",
    "阜新市": "辽宁", "细河区": "辽宁",
    "本溪市": "辽宁", "明山区": "辽宁",
    "凌海市": "辽宁", "黑山县": "辽宁",
    # 黑龙江
    "爱辉区": "黑龙江",
    "牡丹江市": "黑龙江", "佳木斯市": "黑龙江",
    # 宁夏
    "惠农区": "宁夏", "平罗县": "宁夏",
    "沙坡头区": "宁夏",
    # 吉林
    "洪湖市": "湖北",  # Actually 洪湖 is in Hubei!
    # 福建
    "福州市": "福建", "闽侯县": "福建",
    "泉州市": "福建", "晋江市": "福建",
    "漳州市": "福建", "龙海市": "福建",
    # 广东
    "江门市": "广东", "新会区": "广东", "台山市": "广东",
    "鹤山市": "广东", "恩平市": "广东",
    "湛江市": "广东", "雷州市": "广东", "廉江市": "广东",
    "茂名市": "广东", "信宜市": "广东", "高州市": "广东",
    "英德市": "广东", "连州市": "广东",
    "惠城区": "广东", "惠阳区": "广东",
    "清城区": "广东", "清新区": "广东",
    "揭阳市": "广东", "普宁市": "广东",
    "梅州市": "广东", "梅县区": "广东",
    "顺德区": "广东",
    # 江苏
    "昆山市": "江苏", "太仓市": "江苏",
    "宜兴市": "江苏", "江阴市": "江苏", "张家港": "江苏",
    "仪征市": "江苏", "高邮市": "江苏",
    "宿豫区": "江苏", "沭阳县": "江苏",
    "海安市": "江苏", "如皋市": "江苏",
    "溧阳市": "江苏", "金坛区": "江苏",
    "灌南县": "江苏", "东海县": "江苏",
    "赣榆区": "江苏", "连云区": "江苏",
    # 山东
    "垦利区": "山东", "利津县": "山东",
    "寿光市": "山东", "诸城市": "山东",
    "邹城市": "山东", "曲阜市": "山东",
    "兰山区": "山东",
    "薛城区": "山东",
    "烟台市": "山东", "龙口市": "山东", "莱州市": "山东",
    "滕州市": "山东",
    "无棣县": "山东", "阳信县": "山东",
    "高唐县": "山东", "茌平区": "山东",
    "费县": "山东", "平邑县": "山东", "沂水县": "山东", "蒙阴县": "山东",
    "蓬莱区": "山东", "台儿庄": "山东", "峄城区": "山东",
    # 浙江
    "上虞区": "浙江",
    "德清县": "浙江", "长兴县": "浙江", "安吉县": "浙江",
    "海宁市": "浙江", "桐乡市": "浙江",
    "兰溪市": "浙江", "义乌市": "浙江", "东阳市": "浙江",
    "黄岩区": "浙江", "温岭市": "浙江",
    "青田县": "浙江", "缙云县": "浙江", "遂昌县": "浙江",
    "定海区": "浙江",
    # 安徽
    "来安县": "安徽", "全椒县": "安徽", "定远县": "安徽",
    "凤阳县": "安徽", "天长市": "安徽", "明光市": "安徽", "南谯区": "安徽",
    "南陵县": "安徽", "无为市": "安徽",
    "怀宁县": "安徽", "桐城市": "安徽",
    "颍上县": "安徽", "界首市": "安徽", "临泉县": "安徽",
    "当涂县": "安徽", "含山县": "安徽", "和县": "安徽",
    "贵池区": "安徽", "东至县": "安徽", "石台县": "安徽", "青阳县": "安徽",
    "郎溪县": "安徽", "广德市": "安徽", "宁国市": "安徽",
    "旌德县": "安徽", "绩溪县": "安徽",
    "弋江区": "安徽",
    "埇桥区": "安徽", "砀山县": "安徽", "砀山": "安徽",
    "谯城区": "安徽", "涡阳县": "安徽", "利辛县": "安徽",
    "金安区": "安徽", "霍邱县": "安徽", "舒城县": "安徽", "霍山县": "安徽",
    "宣州区": "安徽", "宜秀区": "安徽", "大观区": "安徽", "迎江区": "安徽",
    "铜陵市": "安徽", "阜阳市": "安徽", "滁州市": "安徽",
    "黄山市": "安徽", "马鞍山": "安徽",
    # 重庆
    "涪陵区": "重庆", "綦江区": "重庆",
    "长寿区": "重庆", "大足区": "重庆",
    # 海南
    "儋州市": "海南",
}

def load_config():
    with open(CONFIG_PATH) as f:
        cfg = json.load(f)
    return cfg if isinstance(cfg, list) else cfg.get("crawlers", cfg)

def save_config(config, path=None):
    path = path or CONFIG_PATH
    with open(path, "w") as f:
        json.dump(config, f, ensure_ascii=False, indent=2)

def backup():
    from datetime import datetime
    os.makedirs(BACKUP_DIR, exist_ok=True)
    ts = datetime.now().strftime("%Y%m%d_%H%M%S")
    bp = os.path.join(BACKUP_DIR, f"config_groups_v4_{ts}.json")
    cfg = load_config()
    save_config(cfg, bp)
    return bp

def reclassify_groups():
    cfg = load_config()
    
    # Groups to reclassify
    generic_groups = {"环评", "政府公告", "生态环境", "其他", "全国", "新闻资讯", "规划公示", "部委", "环境保护"}
    
    # Province names (for direct detection)
    all_provinces = ["安徽","江西","江苏","山东","广东","河南","内蒙古","新疆","四川",
                    "湖北","湖南","浙江","山西","贵州","辽宁","甘肃","福建","云南",
                    "广西","河北","黑龙江","陕西","宁夏","重庆","青海","天津","吉林",
                    "上海","北京","西藏","海南"]
    
    changes = []
    
    for item in cfg:
        g = item.get("group", "")
        if g not in generic_groups:
            continue
        
        name = item.get("name", "") or ""
        if not name:
            continue
        
        new_group = None
        
        # 1. Direct province mention in name
        for p in all_provinces:
            if p in name:
                new_group = p
                break
        
        # 2. County/district → province
        if not new_group:
            for cnty, prov in sorted(CNTY_TO_PROV.items(), key=lambda x: -len(x[0])):
                if cnty in name:
                    new_group = prov
                    break
        
        # 3. Enterprise detection
        if not new_group:
            enterprise_kws = ["公司","集团","石化","制药","药业","化工","能源","钢铁","矿业",
                             "新材料","环保科技","环保公司","科技公司"]
            for kw in enterprise_kws:
                if kw in name:
                    new_group = "企业"
                    break
        
        # 4. National platforms
        if not new_group:
            national = ["环评爱好者","环评云","中国化工","新和成"]
            for n in national:
                if n in name:
                    new_group = "全国"
                    break
        
        if new_group and new_group != g:
            changes.append((name, g, new_group))
            item["group"] = new_group
    
    # Print summary
    print(f"共 {len(changes)} 条重新分类\n")
    
    if changes:
        # Group by old→new for display
        summary = {}
        for name, old, new_g in changes:
            key = f"{old} → {new_g}"
            if key not in summary:
                summary[key] = []
            summary[key].append(name)
        
        for key in sorted(summary.keys(), key=lambda k: -len(summary[k])):
            items = summary[key]
            print(f"{key} ({len(items)}条):")
            for n in items[:4]:
                print(f"  {n}")
            if len(items) > 4:
                print(f"  ... 还有 {len(items)-4} 条")
            print()
        
        save_config(cfg)
        print(f"✅ 已保存，{len(changes)} 条分组调整")
    
    return changes

if __name__ == "__main__":
    backup()
    reclassify_groups()
