#!/usr/bin/env python3
from __future__ import annotations

import argparse
import sys
from pathlib import Path

ROOT = Path(__file__).resolve().parents[1]
sys.path.insert(0, str(ROOT / "src"))

from nf_nacional_web.db import MysqlCli, sql_quote
from nf_nacional_web.sync import run_sync_full


def parse_args() -> argparse.Namespace:
    parser = argparse.ArgumentParser(description="Executa sincronizacao full de um municipio.")
    group = parser.add_mutually_exclusive_group(required=True)
    group.add_argument("--municipio-id", type=int, help="ID interno em nfse_municipios.")
    group.add_argument("--codigo-ibge", help="Codigo IBGE do municipio.")
    group.add_argument("--codigo-siafi", help="Codigo SIAFI do municipio.")
    return parser.parse_args()


def resolve_municipio_id(db: MysqlCli, args: argparse.Namespace) -> int:
    if args.municipio_id:
        return args.municipio_id
    if args.codigo_ibge:
        rows = db.query_rows(
            f"""
SELECT id
FROM nfse_municipios
WHERE codigo_ibge = {sql_quote(args.codigo_ibge)}
  AND ativo = 1
ORDER BY id
LIMIT 1;
"""
        )
        if not rows:
            raise SystemExit(f"Municipio nao encontrado para IBGE {args.codigo_ibge}.")
        return int(rows[0][0])
    rows = db.query_rows(
        f"""
SELECT id
FROM nfse_municipios
WHERE codigo_siafi = {sql_quote(args.codigo_siafi)}
  AND ativo = 1
ORDER BY id
LIMIT 1;
"""
    )
    if not rows:
        raise SystemExit(f"Municipio nao encontrado para SIAFI {args.codigo_siafi}.")
    return int(rows[0][0])


def main() -> int:
    args = parse_args()
    db = MysqlCli.from_env()
    municipio_id = resolve_municipio_id(db, args)
    run_sync_full(db.database, municipio_id, locked_by="script-sync-full")
    rows = db.query_rows(
        f"""
SELECT status, last_nsu, max_nsu, COALESCE(last_error_message, '')
FROM nfse_sync_state
WHERE municipio_id = {municipio_id}
LIMIT 1;
"""
    )
    if rows:
        status, last_nsu, max_nsu, error = rows[0]
        print(f"status={status} last_nsu={last_nsu} max_nsu={max_nsu} erro={error}")
    return 0


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