#!/usr/bin/env python3
"""
FAA Registry Builder
Reads MASTER.txt and ACFTREF.txt from /home/pi/adsb-analyzer/faa/
Builds a hex -> aircraft info lookup table using MODE S CODE HEX field.
"""

import os
import csv
import json
from datetime import date

WORK_DIR = '/home/pi/adsb-analyzer/faa'
LOOKUP_FILE = '/home/pi/adsb-analyzer/faa/hex_lookup.json'
DATA_DIR = '/home/pi/adsb-analyzer/data'

def find_file(name):
    for candidate in [name + '.txt', name]:
        fp = os.path.join(WORK_DIR, candidate)
        if os.path.exists(fp):
            return fp
    return None

def build_lookup():
    master = find_file('MASTER')
    if not master:
        print(f'[faa_sync] ERROR: Could not find MASTER or MASTER.txt in {WORK_DIR}')
        return False

    # Load ACFTREF for human-readable make/model
    acftref = find_file('ACFTREF')
    model_lookup = {}
    if acftref:
        print(f'[faa_sync] Reading {acftref}...')
        with open(acftref, 'r', encoding='utf-8-sig') as f:
            reader = csv.DictReader(f)
            for row in reader:
                code = row.get('CODE', '').strip()
                mfr = row.get('MFR', '').strip()
                model = row.get('MODEL', '').strip()
                if code:
                    model_lookup[code] = {'make': mfr, 'model': model}
        print(f'[faa_sync] Loaded {len(model_lookup):,} aircraft type codes')

    print(f'[faa_sync] Reading {master}...')
    hex_lookup = {}
    count = 0
    with open(master, 'r', encoding='utf-8-sig') as f:
        reader = csv.DictReader(f)
        for row in reader:
            # Use MODE S CODE HEX directly — no conversion needed
            hex_code = row.get('MODE S CODE HEX', '').strip().lower()
            if not hex_code:
                continue
            n_num = 'N' + row.get('N-NUMBER', '').strip()
            name = row.get('NAME', '').strip()
            mfr_code = row.get('MFR MDL CODE', '').strip()
            
            make = ''
            model = ''
            if mfr_code in model_lookup:
                make = model_lookup[mfr_code]['make']
                model = model_lookup[mfr_code]['model']

            hex_lookup[hex_code] = {
                'n_number': n_num,
                'make': make,
                'model': model,
                'owner': name,
            }
            count += 1

    print(f'[faa_sync] Built lookup: {count:,} aircraft')

    tmp = LOOKUP_FILE + '.tmp'
    with open(tmp, 'w') as f:
        json.dump(hex_lookup, f)
    os.replace(tmp, LOOKUP_FILE)
    print(f'[faa_sync] Saved to {LOOKUP_FILE}')
    return True

def enrich_existing_data():
    if not os.path.exists(LOOKUP_FILE):
        return
    print('[faa_sync] Enriching existing daily log files...')
    with open(LOOKUP_FILE, 'r') as f:
        lookup = json.load(f)
    enriched = 0
    for fn in sorted(os.listdir(DATA_DIR)):
        if not fn.endswith('.json'):
            continue
        fp = os.path.join(DATA_DIR, fn)
        try:
            with open(fp, 'r') as f:
                day_data = json.load(f)
            changed = False
            for hex_id, rec in day_data.items():
                if hex_id in lookup and 'make' not in rec:
                    info = lookup[hex_id]
                    rec['n_number'] = info.get('n_number', '')
                    rec['make'] = info.get('make', '')
                    rec['model'] = info.get('model', '')
                    rec['owner'] = info.get('owner', '')
                    changed = True
                    enriched += 1
            if changed:
                tmp = fp + '.tmp'
                with open(tmp, 'w') as f:
                    json.dump(day_data, f)
                os.replace(tmp, fp)
        except Exception as e:
            print(f'[faa_sync] Error processing {fn}: {e}')
    print(f'[faa_sync] Enriched {enriched:,} records across existing logs')

if __name__ == '__main__':
    print(f'[faa_sync] FAA Registry Builder — {date.today()}')
    if build_lookup():
        enrich_existing_data()
        print('[faa_sync] Done!')
