#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""生成集团维度指标：采购、商机、工单、售后、特殊要求、单价。

单价口径（用户 2026-11-10 确认）：
- 最近成交价：同一集团同一货号+单位下，日期最新的一笔成交价；
- 历史成交价：同一集团同一货号+单位下的历史成交明细，按日期倒序。
不把不同规格/单位混算成一个均价。
"""
import json, os
from datetime import datetime

ROOT = '/Users/liuxinyuan/Desktop/Hermes输出-工作类'
DATA = os.path.join(ROOT, '数据')


def load(name, default=None):
    try:
        with open(os.path.join(DATA, name), encoding='utf-8') as f:
            return json.load(f)
    except Exception:
        return default if default is not None else {}


def main():
    c360 = load('customer_360.json', {'groups': [], 'customers': []})
    home = load('customer_home_v1.json', {'customers': {}})
    req = load('customer_special_requirements.json', {'items': []})
    price = load('customer_price_history.json', {'hist': {}})
    complaints = load('mcp_complaints.json', {'items': []})
    opps = load('opps_by_customer.json', {})

    groups = c360.get('groups') or []
    home_customers = home.get('customers') or {}
    req_by_cust = {}
    for x in req.get('items') or []:
        cn = x.get('customer') or ''
        if cn:
            req_by_cust.setdefault(cn, []).append(x)
    comp_by_cust = {}
    for x in complaints.get('items') or []:
        cn = x.get('customer') or ''
        if cn:
            comp_by_cust.setdefault(cn, []).append(x)
    price_hist = price.get('hist') or {}

    out = {
        'generated': datetime.now().strftime('%Y-%m-%d %H:%M:%S'),
        'price_rule': '最近成交价 + 历史成交价；按货号+单位分组，不跨规格混算',
        'groups': {},
    }

    for g in groups:
        name = g.get('name') or ''
        if not name:
            continue
        members = g.get('members') or []
        member_set = set(members)

        # 商机：按成员从原始商机快照聚合，不用 group.opps 的展示截断列表
        opp_rows = []
        seen_opp = set()
        for cn in members:
            for o in (opps.get(cn) or []):
                oid = str(o.get('id') or o.get('name') or '')
                if oid in seen_opp:
                    continue
                seen_opp.add(oid)
                opp_rows.append({
                    'id': oid, 'name': o.get('name') or '', 'status': o.get('status') or '',
                    'creator': o.get('creator') or '', 'customer': cn,
                    'url': o.get('url') or '',
                })

        # 工单：客户首页的工单聚合；技术测试单已经来自活动录入，不读 ERP 测试销售订单
        wo = {'technical_test': [], 'rnd_project': [], 'doc_prep': []}
        for cn in members:
            cw = (home_customers.get(cn) or {}).get('work_orders') or {}
            for k in wo:
                for x in ((cw.get(k) or {}).get('items') or []):
                    y = dict(x)
                    y['customer'] = cn
                    wo[k].append(y)

        # 售后：用原始客诉全量，不用客户卡里的展示截断列表
        after = []
        for cn in members:
            for x in comp_by_cust.get(cn, []):
                after.append({
                    'id': x.get('id') or '', 'name': x.get('name') or '客诉',
                    'status': x.get('status') or '', 'date': x.get('created') or '',
                    'customer': cn, 'urgency': x.get('urgency') or '',
                })
        after.sort(key=lambda x: x.get('date') or '', reverse=True)

        # 特殊要求
        special = []
        for cn in members:
            for x in req_by_cust.get(cn, []):
                y = dict(x)
                y['customer'] = cn
                special.append(y)

        # 单价：按货号+单位合并成员成交，最近成交 + 历史成交
        price_map = {}
        for cn in members:
            for sku, info in (price_hist.get(cn) or {}).items():
                for fam, f in ((info or {}).get('fams') or {}).items():
                    deals = (f or {}).get('deals') or []
                    if (f or {}).get('last') and not deals:
                        deals = [(f or {}).get('last')]
                    for d in deals:
                        if not isinstance(d, dict):
                            continue
                        unit = d.get('u') or fam
                        key = (sku, unit)
                        row = price_map.setdefault(key, {'sku': sku, 'unit': unit, 'deals': [], 'members': set()})
                        row['members'].add(cn)
                        sig = (d.get('d') or '', d.get('no') or '', d.get('p'), d.get('q'))
                        if not any((z.get('d') or '', z.get('no') or '', z.get('p'), z.get('q')) == sig for z in row['deals']):
                            row['deals'].append(d)
        unit_prices = []
        for (sku, unit), row in price_map.items():
            ds = sorted(row['deals'], key=lambda x: (x.get('d') or '', x.get('no') or ''), reverse=True)
            if not ds:
                continue
            last = ds[0]
            unit_prices.append({
                'sku': sku, 'unit': unit,
                'latest': {'p': last.get('p'), 'u': last.get('u') or unit, 'd': last.get('d') or '',
                           'no': last.get('no') or '', 'q': last.get('q')},
                'history': [{'p': x.get('p'), 'u': x.get('u') or unit, 'd': x.get('d') or '',
                             'no': x.get('no') or '', 'q': x.get('q')} for x in ds[:20]],
                'count': len(ds),
                'members': sorted(row['members']),
            })
        unit_prices.sort(key=lambda x: ((x.get('latest') or {}).get('d') or '', x.get('sku') or ''), reverse=True)

        out['groups'][name] = {
            'name': name,
            'sales': g.get('sales') or '',
            'member_count': len(members),
            'members': members,
            'purchase': {
                'y2024': g.get('y2024') or 0,
                'y2025': g.get('y2025') or 0,
                'y2026': g.get('y2026') or 0,
                'total': g.get('total') or 0,
                'three_year': (g.get('y2024') or 0) + (g.get('y2025') or 0) + (g.get('y2026') or 0),
            },
            'opportunities': {'count': len(opp_rows), 'items': opp_rows},
            'work_orders': {
                'technical_test': {'count': len(wo['technical_test']), 'items': wo['technical_test'], 'source': '活动录入 · 技术支持测试单'},
                'rnd_project': {'count': len(wo['rnd_project']), 'items': wo['rnd_project'], 'source': 'V2待接入'},
                'doc_prep': {'count': len(wo['doc_prep']), 'items': wo['doc_prep'], 'source': 'V2待接入'},
                'after_sales': {'count': len(after), 'items': after, 'source': '客诉记录（全量）'},
            },
            'after_sales': {'count': len(after), 'items': after},
            'special_requirements': {'count': len(special), 'items': special},
            'unit_prices': {'count': len(unit_prices), 'items': unit_prices},
        }

    p = os.path.join(DATA, 'customer_group_metrics.json')
    tmp = p + '.tmp'
    with open(tmp, 'w', encoding='utf-8') as f:
        json.dump(out, f, ensure_ascii=False, separators=(',', ':'))
    os.replace(tmp, p)
    print('written', p, os.path.getsize(p), 'bytes', len(out['groups']), 'groups')
    if '圣湘集团' in out['groups']:
        g = out['groups']['圣湘集团']
        print('圣湘集团', 'opps', g['opportunities']['count'], 'tech', g['work_orders']['technical_test']['count'],
              'after', g['after_sales']['count'], 'special', g['special_requirements']['count'],
              'price_rows', g['unit_prices']['count'])


if __name__ == '__main__':
    main()
