#!/usr/bin/env python3
import argparse
import sys
from pathlib import Path

BASE = Path(__file__).resolve().parent
sys.path.insert(0, str(BASE / 'vendor'))
from pypdf import PdfReader


def val(fields, key):
    item = fields.get(key) or {}
    value = item.get('/V', '')
    return str(value).lstrip('/')


def fail(tipo, detail, code=2):
    print(f'PT_V624_CHECK_FAIL={tipo}|{detail}', file=sys.stderr)
    return code


def main():
    ap = argparse.ArgumentParser()
    ap.add_argument('--tipo', required=True, choices=['convenio', 'aviso_delegacion', 'carta_cfdi'])
    ap.add_argument('--pdf', required=True)
    args = ap.parse_args()

    p = Path(args.pdf)
    if not p.is_file():
        return fail(args.tipo, f'pdf_no_existe:{p}')
    if p.stat().st_size < 5000:
        return fail(args.tipo, f'pdf_demasiado_pequeno:{p.stat().st_size}')

    try:
        r = PdfReader(str(p))
        fields = r.get_fields() or {}
    except Exception as exc:
        return fail(args.tipo, f'pdf_no_legible:{exc}')

    print(f'PT_V624_CHECK_START={args.tipo}')
    print(f'PT_V624_CHECK_PAGES={len(r.pages)}')
    print(f'PT_V624_CHECK_FIELDS={len(fields)}')

    if args.tipo == 'aviso_delegacion':
        expected = {
            'MARCA': 'CHEVROLET',
            'TIPO': 'AVEO',
            'SERIE': '3G1TA5AF0RL000003',
            'PLACAS': 'ABC123D',
        }
        for key, want in expected.items():
            got = val(fields, key)
            print(f'PT_V624_CHECK_FIELD={key}|{got}')
            if got != want:
                return fail(args.tipo, f'{key}:esperado={want}:actual={got}')

    elif args.tipo == 'carta_cfdi':
        expected = {
            'Text489': 'DEMO-PT-003',
            'Text485': 'DEMO-POL-003',
            'Nombre completo': 'ASEGURADO DEMO TRES',
            'Text44': 'CHEVROLET',
            'Text46': '3G1TA5AF0RL000003',
        }
        for key, want in expected.items():
            got = val(fields, key)
            print(f'PT_V624_CHECK_FIELD={key}|{got}')
            if got != want:
                return fail(args.tipo, f'{key}:esperado={want}:actual={got}')
        chars = ['Text50','Text501','Text5013','4','5','6','7','8','9','10','11','12','13']
        got_rfc = ''.join(val(fields, k) for k in chars)
        print(f'PT_V624_CHECK_RFC={got_rfc}')
        if got_rfc != 'XAXX010101000':
            return fail(args.tipo, f'rfc:esperado=XAXX010101000:actual={got_rfc}')

    elif args.tipo == 'convenio':
        if len(r.pages) != 3:
            return fail(args.tipo, f'paginas_esperadas=3:actual={len(r.pages)}')
        pf = ['rfc'] + [f'rfc{i}' for i in range(2, 14)]
        got_rfc = ''.join(val(fields, k) for k in pf)
        print(f'PT_V624_CHECK_RFC_PF={got_rfc}')
        print('PT_V624_CHECK_RFC_FIELDS_PRESENT=' + str(sum(1 for k in pf if k in fields)))
        if got_rfc != 'XAXX010101000':
            # Diagnostic only: show whether an alternate PM field family exists.
            pm = [f'RFFCC{i}' for i in range(1, 13)]
            got_pm = ''.join(val(fields, k) for k in pm)
            print(f'PT_V624_CHECK_RFC_PM={got_pm}')
            print('PT_V624_CHECK_PM_FIELDS_PRESENT=' + str(sum(1 for k in pm if k in fields)))
            return fail(args.tipo, f'rfc_pf:esperado=XAXX010101000:actual={got_rfc}')
        try:
            txt = r.pages[1].extract_text() or ''
        except Exception as exc:
            txt = ''
            print(f'PT_V624_CHECK_PAGE2_EXTRACT_WARN={exc}')
        has_bank = 'Banco: BANCO DEMO' in txt
        has_clabe = 'CLABE: 012345678901234567' in txt
        if not (has_bank and has_clabe):
            raw = p.read_bytes()
            has_bank = has_bank or (b'BANCO DEMO' in raw)
            has_clabe = has_clabe or (b'012345678901234567' in raw)
        print(f'PT_V624_CHECK_BANK={1 if has_bank else 0}')
        print(f'PT_V624_CHECK_CLABE={1 if has_clabe else 0}')
        if not has_bank:
            return fail(args.tipo, 'banco_no_encontrado')
        if not has_clabe:
            return fail(args.tipo, 'clabe_no_encontrada')

    print(f'PT_V624_SELFTEST_OK={args.tipo}')
    return 0


if __name__ == '__main__':
    raise SystemExit(main())
