"""Bind native internal aliases and graph paths to the same training metadata."""
import hashlib,json
from build_graph import sequences,sha
from build_genome_control import records

def references(native,panel):
    aliases_path=native.parent/'aliases.json'
    aliases=json.loads(aliases_path.read_text())
    complete=json.loads((native.parent/'COMPLETE.json').read_text())
    assert sha(aliases_path)==complete['output_sha256']['aliases.json']
    seqs={};meta={};graph={}
    for sidecar in sorted(panel.glob('HLA-*.json')):
        data=sequences(sidecar.with_suffix('.fa'));rows=json.loads(sidecar.read_text())
        assert {r['path'] for r in rows}==set(data)
        for r in rows:
            name=r['path'];sequence=data[name]
            assert hashlib.sha256(sequence.encode()).hexdigest()==r['sequence_sha256']
            assert len(sequence)>4000 and r['core_ids']
            seqs[name]=sequence
            meta[name]={'gene':sidecar.stem.removeprefix('HLA-'),'labels':[x.removeprefix('HLA-') for x in r['genomic_labels']],'cds_labels':r['cds_labels'],'source':'graph','body':[2000,len(sequence)-2000],'sources':r['sources'],'core_ids':r['core_ids'],'sequence_sha256':r['sequence_sha256']}
            graph[name]=r
    seen=set()
    for name,(_,sequence) in records(native.read_text(),validate_coordinates=False).items():
        identifier='IPD:'+name
        if name in aliases:
            a=aliases[name];path=a['path'];assert path in graph and a['core_ids']==graph[path]['core_ids']
            assert sequence==seqs[path] and a['genomic_labels']==graph[path]['genomic_labels']
            meta[identifier]=dict(meta[path],source='graph',native_alias=name,graph_path=path)
            seen.add(name)
        else:
            assert '*PG' not in name,'Unresolved internal reference alias'
            meta[identifier]={'gene':name.split('*')[0].removeprefix('HLA-'),'labels':[name.removeprefix('HLA-')],'core_ids':[],'source':'ipd','body':[0,len(sequence)],'sequence_sha256':hashlib.sha256(sequence.encode()).hexdigest()}
        seqs[identifier]=sequence
    assert seen==set(aliases)
    return seqs,meta
