"""
人群包分析脚本：解析G1-G5 RTF/TXT文件，输出洞察JSON
用法：python3 analyze_crowd.py <g1.txt> <g2.txt> <g3.txt> <g4.txt> <g5.txt> <output.json>
"""
import json, sys, os

def read_file(path):
    for enc in ['utf-8', 'gbk', 'gb2312', 'gb18030']:
        try:
            with open(path, 'r', encoding=enc) as f:
                return f.read()
        except (UnicodeDecodeError, LookupError):
            continue
    raise ValueError(f"无法解码: {path}")

def extract_json(text):
    start = text.find('{')
    if start == -1:
        return None
    depth, end = 0, start
    for i in range(start, len(text)):
        if text[i] == '{': depth += 1
        elif text[i] == '}': depth -= 1
        if depth == 0:
            end = i + 1
            break
    return json.loads(text[start:end])

def parse_report(data):
    """从DMP JSON中提取reportDetail"""
    if isinstance(data, dict):
        if 'data' in data and isinstance(data['data'], dict):
            inner = data['data']
            if 'data' in inner and isinstance(inner['data'], dict):
                return inner['data'].get('reportDetail', [])
            return inner.get('reportDetail', [])
    return []

def get_tag_values(report, tag_en):
    """获取指定标签的值分布"""
    for item in report:
        if item.get('tagEn') == tag_en:
            return item.get('tagValueCoverResult', [])
    return []

def calc_tgi(g5_ratio, g1_ratio):
    if g1_ratio <= 0:
        return 0
    return round(g5_ratio / g1_ratio * 100, 1)

def analyze(files):
    stages = ['G1', 'G2', 'G3', 'G4', 'G5']
    reports = {}
    total_users = {}

    for i, f in enumerate(files):
        text = read_file(f)
        data = extract_json(text)
        if not data:
            raise ValueError(f"无法解析JSON: {f}")
        report = parse_report(data)
        stage = stages[i]
        reports[stage] = report

        # 提取总人数
        if isinstance(data, dict) and 'data' in data:
            inner = data['data']
            if isinstance(inner, dict) and 'data' in inner:
                total_users[stage] = inner['data'].get('totalNum', 0)
            else:
                total_users[stage] = inner.get('totalNum', 0)
        else:
            total_users[stage] = 0

    result = {
        'total_users': total_users,
        'funnel_rate': round(total_users.get('G5', 0) / total_users.get('G1', 1) * 100, 2),
        'demographics': {},
        'strategy_crowd': {},
        'navigation_top': {},
        'key_insights': []
    }

    # 性别分析
    gender_tags = ['gender']
    for tag in gender_tags:
        g1_vals = get_tag_values(reports['G1'], tag)
        g5_vals = get_tag_values(reports['G5'], tag)
        if g1_vals and g5_vals:
            gender_data = []
            for v1 in g1_vals:
                name = v1.get('tagValueCn', v1.get('tagValue', ''))
                r1 = v1.get('coverRate', 0)
                r5 = next((v.get('coverRate', 0) for v in g5_vals
                          if v.get('tagValueCn', v.get('tagValue', '')) == name), 0)
                gender_data.append({
                    'name': name, 'g1': r1, 'g5': r5,
                    'tgi': calc_tgi(r5, r1),
                    'change': round(r5 - r1, 2)
                })
            result['demographics']['gender'] = gender_data

    # 年龄分析
    for tag in ['age', 'age_range']:
        g1_vals = get_tag_values(reports['G1'], tag)
        g5_vals = get_tag_values(reports['G5'], tag)
        if g1_vals and g5_vals:
            age_data = []
            for v1 in g1_vals:
                name = v1.get('tagValueCn', v1.get('tagValue', ''))
                r1 = v1.get('coverRate', 0)
                r5 = next((v.get('coverRate', 0) for v in g5_vals
                          if v.get('tagValueCn', v.get('tagValue', '')) == name), 0)
                age_data.append({
                    'name': name, 'g1': r1, 'g5': r5,
                    'tgi': calc_tgi(r5, r1),
                    'change_pct': round((r5 - r1) / r1 * 100, 1) if r1 > 0 else 0
                })
            result['demographics']['age'] = sorted(age_data, key=lambda x: -x['tgi'])
            break

    # 人生阶段
    for tag in ['life_stage', 'lifeStage']:
        g1_vals = get_tag_values(reports['G1'], tag)
        g5_vals = get_tag_values(reports['G5'], tag)
        if g1_vals and g5_vals:
            ls_data = []
            for v1 in g1_vals:
                name = v1.get('tagValueCn', v1.get('tagValue', ''))
                r1 = v1.get('coverRate', 0)
                r5 = next((v.get('coverRate', 0) for v in g5_vals
                          if v.get('tagValueCn', v.get('tagValue', '')) == name), 0)
                ls_data.append({
                    'name': name, 'g1': r1, 'g5': r5,
                    'tgi': calc_tgi(r5, r1)
                })
            result['demographics']['life_stage'] = sorted(ls_data, key=lambda x: -x['tgi'])
            break

    # 八大策略人群
    for tag in ['strategy_crowd', 'strategyCrowd', 'crowd_strategy']:
        g1_vals = get_tag_values(reports['G1'], tag)
        g5_vals = get_tag_values(reports['G5'], tag)
        if g1_vals and g5_vals:
            sc_data = []
            for v1 in g1_vals:
                name = v1.get('tagValueCn', v1.get('tagValue', ''))
                r1 = v1.get('coverRate', 0)
                r5 = next((v.get('coverRate', 0) for v in g5_vals
                          if v.get('tagValueCn', v.get('tagValue', '')) == name), 0)
                sc_data.append({
                    'name': name, 'g1': r1, 'g5': r5,
                    'tgi': calc_tgi(r5, r1)
                })
            result['strategy_crowd'] = sorted(sc_data, key=lambda x: -x['tgi'])
            break

    # 导航TOP场所
    for tag in ['navigation_top20', 'navigation_top', 'nav_top20']:
        g1_vals = get_tag_values(reports['G1'], tag)
        g5_vals = get_tag_values(reports['G5'], tag)
        if g1_vals and g5_vals:
            nav_data = []
            for v1 in g1_vals:
                name = v1.get('tagValueCn', v1.get('tagValue', ''))
                r1 = v1.get('coverRate', 0)
                r5 = next((v.get('coverRate', 0) for v in g5_vals
                          if v.get('tagValueCn', v.get('tagValue', '')) == name), 0)
                nav_data.append({
                    'name': name, 'g1': r1, 'g5': r5,
                    'tgi': calc_tgi(r5, r1)
                })
            result['navigation_top'] = sorted(nav_data, key=lambda x: -x['tgi'])
            break

    # 生成关键洞察
    insights = []
    if 'gender' in result['demographics']:
        for g in result['demographics']['gender']:
            if g['tgi'] > 100:
                insights.append(f"{g['name']}转化倾向更强(TGI={g['tgi']})")
    if 'age' in result['demographics']:
        top_age = result['demographics']['age'][0]
        insights.append(f"年龄段{top_age['name']}增幅最大(TGI={top_age['tgi']})")
    if 'life_stage' in result['demographics']:
        top_ls = result['demographics']['life_stage'][0]
        insights.append(f"'{top_ls['name']}'TGI={top_ls['tgi']}，G5过表达")
    if result.get('strategy_crowd'):
        high_sc = [s for s in result['strategy_crowd'] if s['tgi'] > 100]
        if high_sc:
            insights.append(f"策略人群'{high_sc[0]['name']}'G5富集(TGI={high_sc[0]['tgi']})")
    if result.get('navigation_top'):
        top_nav = result['navigation_top'][0]
        insights.append(f"导航'{top_nav['name']}'TGI={top_nav['tgi']}，最强转化信号")

    result['key_insights'] = insights
    return result

if __name__ == '__main__':
    if len(sys.argv) < 7:
        print("Usage: python3 analyze_crowd.py g1.txt g2.txt g3.txt g4.txt g5.txt output.json")
        sys.exit(1)
    files = sys.argv[1:6]
    output = sys.argv[6]
    result = analyze(files)
    with open(output, 'w', encoding='utf-8') as f:
        json.dump(result, f, ensure_ascii=False, indent=2)
    print(f"分析完成，输出: {output}")
