# -*- coding: utf-8 -*-
"""Record actual effort, comments and final workflow states, then read back."""
import json
from datetime import datetime
from zoneinfo import ZoneInfo
from pathlib import Path
from transport import api, PREFIX

HERE = Path(__file__).resolve().parent
STATE = json.loads((HERE / 'items.sanitized.json').read_text())
ASSIGNEE = '635755195dc8531eeb2e33d9'
BRANCH = 'codex/VWCG-1452-consume-department-filter-20261019'
COMMIT = '974d09a4d8eb71ea42c9df15e6a83c42eb0dcb9d'
MR_URL = 'https://codeup.aliyun.com/60069db88deaa14d9e02b875/zhct/store/change/980'
TZ = ZoneInfo('Asia/Shanghai')

def millis(text):
    return int(datetime.fromisoformat(text).replace(tzinfo=TZ).timestamp() * 1000)

def as_list(value):
    if isinstance(value, list):
        return value
    return (value or {}).get('result', (value or {}).get('items', (value or {}).get('comments', [])))

def ensure_effort(task_id, marker, actual_time, start, end, label):
    path = PREFIX + '/workitems/' + task_id + '/effortRecords'
    rows = as_list(api('GET', path))
    matches = [row for row in rows if marker in str(row.get('description', ''))]
    if not matches:
        api('POST', path, {
            'operatorId': ASSIGNEE,
            'actualTime': actual_time,
            'gmtStart': millis(start),
            'gmtEnd': millis(end),
            'description': marker + ' ' + label + '；按本次真实AI辅助执行时间登记，包含方案/分析时间，不含用户等待。',
        })
    rows = as_list(api('GET', path))
    matches = [row for row in rows if marker in str(row.get('description', ''))]
    if len(matches) != 1 or matches[0].get('owner', {}).get('id') != ASSIGNEE:
        raise RuntimeError('Actual effort readback failed: ' + marker)
    return matches[0]

def ensure_comment(item_id, marker, content):
    path = PREFIX + '/workitems/' + item_id + '/comments'
    rows = as_list(api('GET', path))
    matches = [row for row in rows if marker in str(row.get('content', row.get('comment', '')))]
    if not matches:
        api('POST', path, {'content': marker + '\n' + content})
    rows = as_list(api('GET', path))
    matches = [row for row in rows if marker in str(row.get('content', row.get('comment', '')))]
    if len(matches) != 1:
        raise RuntimeError('Comment readback failed: ' + marker)
    return matches[0]

development = STATE['tasks']['development']
validation = STATE['tasks']['validation']
efforts = {
    'development': ensure_effort(
        development['id'], 'VWCG1450-ACTUAL-DEVELOPMENT', 0.6,
        '2026-10-19T09:21:00', '2026-10-19T09:57:00',
        '需求理解、代码核验、交互方案、实现与自审',
    ),
    'validation': ensure_effort(
        validation['id'], 'VWCG1450-ACTUAL-VALIDATION', 0.3,
        '2026-10-19T09:57:00', '2026-10-19T10:15:00',
        '自动化测试、参数契约、生产构建、页面验收、Codeup和云效收尾',
    ),
}

validation_summary = '3个前端测试套件、13项测试通过；Node 14生产构建通过；本地真实页面验证下拉内全选/反选；git diff --check通过。ESLint因项目既有indent规则严重级别配置为无效值4未能运行，本任务未改全局配置。'
development_comment = f'''代码已提交并关联。
- Use Case：UC-ORDER-021 v1.0，覆盖M1-M5、A1-A3、E1-E2、R1及AC-001～AC-005。
- 分支：{BRANCH}
- Commit：{COMMIT}（#VWCG-1452 消费订单部门筛选支持全选反选）
- Codeup MR：{MR_URL}，目标分支 guoxin_develop，ahead=1、behind=0、NO_CONFLICT、allRequirementsPass=true。
- 验证：{validation_summary}
- 工时：预计4h（无AI完整交付，包含方案时间），实际0.6h（AI辅助真实投入）。
- 兼容：未修改接口、Controller、Logic、路由和数据库；列表/合计/异步导出继续使用原部门UUID参数。'''
validation_comment = f'''测试回归完成。
- 关联代码：{COMMIT}
- Codeup MR：{MR_URL}
- 结果：{validation_summary}
- 工时：预计2h（无AI测试与验收，包含测试设计），实际0.3h（AI辅助真实投入）。
- 未执行：真实下单、支付、扣款、退款写操作；本次仅前端筛选与只读查询契约。'''
parent_comment = f'''VWCG-1450 已完成开发提交，进入待测试。
- 子任务：{development['serialNumber']} 开发完成；{validation['serialNumber']} 已完成。
- 分支：{BRANCH}
- Commit：{COMMIT}
- Codeup MR：{MR_URL}（目标 guoxin_develop，待评审合并）。
- 验证：{validation_summary}
- 工时：预计合计6h；实际合计0.9h，均包含需求分析/方案及验证时间。
- 非影响边界：订单生成、支付、扣款、退款、数据权限和接口契约未修改。'''

comments = {
    'development': ensure_comment(development['id'], 'VWCG1450-WRITEBACK-DEVELOPMENT', development_comment),
    'validation': ensure_comment(validation['id'], 'VWCG1450-WRITEBACK-VALIDATION', validation_comment),
    'parent': ensure_comment(STATE['parent']['id'], 'VWCG1450-WRITEBACK-PARENT', parent_comment),
}

api('PUT', PREFIX + '/workitems/' + development['id'], {'status': '100011'})
api('PUT', PREFIX + '/workitems/' + validation['id'], {'status': '100014'})
api('PUT', PREFIX + '/workitems/' + STATE['parent']['id'], {'status': '1dec9023be7be6cf79e6bde901'})

readback = {
    'parent': api('GET', PREFIX + '/workitems/VWCG-1450'),
    'development': api('GET', PREFIX + '/workitems/' + development['serialNumber']),
    'validation': api('GET', PREFIX + '/workitems/' + validation['serialNumber']),
    'efforts': efforts,
    'comments': comments,
    'branch': BRANCH,
    'commit': COMMIT,
    'mr': {
        'localId': 980,
        'url': MR_URL,
        'targetBranch': 'guoxin_develop',
        'status': 'TO_BE_MERGED',
        'ahead': 1,
        'behind': 0,
        'allRequirementsPass': True,
    },
}
expected = {'parent': '待测试', 'development': '开发完成', 'validation': '已完成'}
for key, status in expected.items():
    if readback[key].get('status', {}).get('name') != status:
        raise RuntimeError(f'{key} status mismatch: {readback[key].get("status")}')

def sanitize_item(item):
    fields = {}
    for row in item.get('customFieldValues', []):
        if row.get('fieldId') in {'79', '80', '101586', '101587', 'sumPlanedLaborHour', 'sumActualLaborHour'}:
            fields[row['fieldId']] = row.get('values')
    return {
        'id': item.get('id'),
        'serialNumber': item.get('serialNumber'),
        'subject': item.get('subject'),
        'assignedTo': item.get('assignedTo'),
        'status': item.get('status'),
        'parentId': item.get('parentId'),
        'fields': fields,
    }

sanitized = {
    'parent': sanitize_item(readback['parent']),
    'development': sanitize_item(readback['development']),
    'validation': sanitize_item(readback['validation']),
    'efforts': {
        key: {field: row.get(field) for field in ['id', 'actualTime', 'gmtStart', 'gmtEnd', 'description', 'owner']}
        for key, row in efforts.items()
    },
    'commentIds': {key: row.get('id') for key, row in comments.items()},
    'branch': BRANCH,
    'commit': COMMIT,
    'mr': readback['mr'],
}
(HERE / 'completion-readback.sanitized.json').write_text(json.dumps(sanitized, ensure_ascii=False, indent=2) + '\n')
print(json.dumps(sanitized, ensure_ascii=False, indent=2))
