# -*- coding: utf-8 -*-
"""Update VWCG-1450 UC and create/read back two child tasks idempotently."""
import html, json
from pathlib import Path
from transport import api, PREFIX, SPACE, compact

HERE = Path(__file__).resolve().parent
WORK = HERE.parent
STATE = HERE / 'items.sanitized.json'
ASSIGNEE = '635755195dc8531eeb2e33d9'
TASK_TYPE = 'ba102e46bc6a8483d9b7f25c'
PARENT_SERIAL = 'VWCG-1450'
PARENT_ID = '3a83e3246ad1054b4f2565f1ac'
state = json.loads(STATE.read_text()) if STATE.exists() else {'tasks': {}}

def save():
    STATE.write_text(json.dumps(state, ensure_ascii=False, indent=2) + '\n')

def markdown_to_html(source):
    parts = []
    for raw in source.splitlines():
        line = raw.strip()
        if not line:
            continue
        if line.startswith('# '):
            parts.append(f'<h1>{html.escape(line[2:])}</h1>')
        elif line.startswith('## '):
            parts.append(f'<h2>{html.escape(line[3:])}</h2>')
        elif line.startswith('- '):
            parts.append(f'<p>• {html.escape(line[2:])}</p>')
        else:
            parts.append(f'<p>{html.escape(line)}</p>')
    return ''.join(parts)

def find_task(title):
    result = api('POST', PREFIX + '/workitems:search', {
        'spaceId': SPACE,
        'category': 'Task',
        'page': 1,
        'perPage': 200,
        'orderBy': 'gmtCreate',
        'sort': 'desc',
    })
    rows = result if isinstance(result, list) else result.get('result', result.get('items', []))
    return next((item for item in rows if item.get('subject') == title and item.get('parentId') == PARENT_ID), None)

def create_task(title, description):
    result = api('POST', PREFIX + '/workitems', {
        'spaceId': SPACE,
        'workitemTypeId': TASK_TYPE,
        'subject': title,
        'description': description,
        'documentFormat': 'MARKDOWN',
        'assignedTo': ASSIGNEE,
        'status': '100005',
        'participants': [ASSIGNEE],
        'parentId': PARENT_ID,
        'customFieldValues': {'79': '2026-10-19', '80': '2026-10-19'},
    })
    item_id = result.get('id', result.get('identifier')) if isinstance(result, dict) else result
    if not item_id:
        raise RuntimeError('Create task returned no identifier')
    return str(item_id)

parent = api('GET', PREFIX + '/workitems/' + PARENT_SERIAL)
assert parent.get('id') == PARENT_ID
assert parent.get('assignedTo', {}).get('id') == ASSIGNEE
parent_body = markdown_to_html((WORK / 'parent-use-case.md').read_text())
api('PUT', PREFIX + '/workitems/' + PARENT_ID, {
    'subject': parent['subject'],
    'description': parent_body,
    'formatType': 'RICHTEXT',
    'assignedTo': ASSIGNEE,
    'status': parent['status']['id'],
})
parent = api('GET', PREFIX + '/workitems/' + PARENT_SERIAL)
for marker in ['UC-ORDER-021', '主流程', '异常/恢复', '验收标准', '测试矩阵', 'DoR', 'READY']:
    if marker not in str(parent.get('description', '')):
        raise RuntimeError('Parent marker missing: ' + marker)
state['parent'] = compact(parent)
save()

tasks = [
    ('development', '开发：消费订单当前/原部门筛选全选反选', 4, WORK / 'development-task.md'),
    ('validation', '测试：消费订单部门筛选与异步导出参数回归', 2, WORK / 'validation-task.md'),
]
for key, title, estimate, document in tasks:
    existing = state['tasks'].get(key) or find_task(title)
    task_id = existing['id'] if existing else create_task(title, document.read_text())
    item = api('GET', PREFIX + '/workitems/' + task_id)
    assert item.get('parentId') == PARENT_ID
    assert item.get('assignedTo', {}).get('id') == ASSIGNEE
    for marker in ['Use Case', '主流程', '异常/恢复', '验收', '测试', 'DoR']:
        if marker not in str(item.get('description', '')):
            raise RuntimeError(f'{key} marker missing: {marker}')
    estimates = api('GET', PREFIX + '/workitems/' + task_id + '/estimatedEfforts') or []
    if not isinstance(estimates, list):
        estimates = estimates.get('result', estimates.get('items', []))
    if not estimates:
        api('POST', PREFIX + '/workitems/' + task_id + '/estimatedEfforts', {
            'spentTime': estimate,
            'owner': ASSIGNEE,
            'description': '按未使用AI的需求理解、方案、实现、测试、审查和交付完整投入估算；包含方案时间，不作为实际工时。',
        })
    estimates = api('GET', PREFIX + '/workitems/' + task_id + '/estimatedEfforts') or []
    state['tasks'][key] = {**compact(item), 'planStart': '2026-10-19', 'planEnd': '2026-10-19', 'estimatedHours': estimate, 'estimateReadback': estimates}
    save()

print(json.dumps({
    'parent': state['parent'],
    'tasks': {key: {field: value.get(field) for field in ['id', 'serialNumber', 'subject', 'assignedTo', 'status', 'estimatedHours']} for key, value in state['tasks'].items()},
}, ensure_ascii=False, indent=2))
