"""Read-only collector. Requires prior local admission and an existing floor DB.

No node installation, signing, transactions, auto-bootstrap or PASS output.
"""
import argparse,hashlib,json,sys,time
from pathlib import Path
import nb01 as n
def file_hashes(mapping):
    expected={client+'.'+field for client in ['bor','heimdall'] for field in ['binary_sha256','config_sha256','genesis_file_sha256']}
    n.need(type(mapping)is dict and set(mapping)==expected,'FILE_MAP')
    out={}
    for label,name in mapping.items():
        n.need(type(name)is str,'FILE_MAP');path=Path(name)
        n.need(path.is_absolute() and path.is_file() and not path.is_symlink(),'LOCAL_FILE')
        digest=hashlib.sha256();size=0
        with path.open('rb') as f:
            while data:=f.read(65536):
                size+=len(data);n.need(size<=536870912,'LOCAL_FILE_LIMIT');digest.update(data)
        out[label]='0x'+digest.hexdigest()
    return out
def main():
    p=argparse.ArgumentParser(description=__doc__)
    for name in ['policy','bootstrap','anchor-context','request','file-map','floor-store']:p.add_argument('--'+name,required=True,type=Path)
    p.add_argument('--clock-uncertainty',required=True,type=int);args=p.parse_args()
    def load(path):return n.a.raw_json(path.read_bytes())
    try:
        policy=load(args.policy);envelope=load(args.bootstrap);context=load(args.anchor_context);request=load(args.request)
        files=file_hashes(load(args.file_map));now=int(time.time())
        bootstrap=n.verify_bootstrap(policy,envelope,context,now,args.clock_uncertainty,files)
        store=n.FloorStore(args.floor_store,policy)
        result=n.collect(policy,bootstrap,envelope,context,request,store,n.PinnedHTTPS(bootstrap),now,args.clock_uncertainty)
        print(json.dumps(result,indent=2))
    except (n.Error,n.a.Error,n.a.p1.P1Error) as ex:
        print(json.dumps({'adapter_result':ex.code,'can_assert_xcim_pass':False,'consensus_proof_verified':False}));raise SystemExit(1)
    except (OSError,KeyError,TypeError,ValueError):
        print(json.dumps({'adapter_result':'LOCAL_INPUT_UNAVAILABLE','can_assert_xcim_pass':False,'consensus_proof_verified':False}));raise SystemExit(1)
if __name__=='__main__':main()
