# -*- coding: utf-8 -*-
"""Associate verified real commits; MR is explicitly reserved to the user."""
import json
from pathlib import Path
from transport import api,PREFIX,ORG
HERE=Path(__file__).resolve().parent
state=json.loads((HERE/'items.sanitized.json').read_text());commits=json.loads((HERE/'commits.sanitized.json').read_text())
result={}
def relations(item_id):
    errors=[]
    for prefix in [PREFIX+'/workitems/','/oapi/v1/projex/workitems/']:
        try:return prefix,api('GET',prefix+item_id+'/extRelationRecords?category=codeupCommit') or []
        except RuntimeError as e:errors.append(str(e))
    raise RuntimeError('; '.join(errors))
for repo,c in commits.items():
    verified=api('GET',f'/oapi/v1/codeup/organizations/{ORG}/repositories/{c["projectId"]}/commits/{c["sha"]}')
    if isinstance(verified,dict):
        remote_id=verified.get('id',verified.get('sha'))
        if remote_id and remote_id!=c['sha']:raise RuntimeError('Codeup commit mismatch')
    result[repo]={'codeup_verified':True,'sha':c['sha']}
for key,item in [('parent',state['parent']),('development',state['tasks']['development']),('validation',state['tasks']['validation'])]:
    item_id=item['id'];prefix,rows=relations(item_id)
    if not isinstance(rows,list):rows=rows.get('result',rows.get('items',[]))
    for repo,c in commits.items():
        if not any(x.get('businessId',x.get('commitSha'))==c['sha'] and str(x.get('projectId',c['projectId']))==str(c['projectId']) for x in rows):
            api('POST',prefix+item_id+'/extRelationRecords',{'category':'codeupCommit','projectId':str(c['projectId']),'commitSha':c['sha'],'title':c['subject'],'url':c['url']})
    _,final=relations(item_id)
    if not isinstance(final,list):final=final.get('result',final.get('items',[]))
    for c in commits.values():
        assert any(x.get('businessId',x.get('commitSha'))==c['sha'] for x in final),'Association readback missing'
    result[key]={'serialNumber':item['serialNumber'],'relations':final}
(HERE/'code-relations.sanitized.json').write_text(json.dumps(result,ensure_ascii=False,indent=2))
print(json.dumps({k:({'sha':v['sha'],'verified':True} if 'sha' in v else {'serialNumber':v['serialNumber'],'commit_relations':len(v['relations'])}) for k,v in result.items()},ensure_ascii=False))
