"""
Test script — fetch ONE page from the NIPEZ keyword API with all known + extra attributes.
No DB writes. Just prints the raw first result so we can see every field the API returns.
"""

import requests
import json
import sys
import os

if sys.platform == 'win32':
    sys.stdout.reconfigure(encoding='utf-8')

from dotenv import load_dotenv
load_dotenv(os.path.join(os.path.dirname(__file__), '../.env'))

KEYWORDS = [k.strip() for k in os.getenv('KEYWORDS', '').split(',') if k.strip()]
KEYWORD  = KEYWORDS[0] if KEYWORDS else 'software'

API_URL = "https://nen.nipez.cz/api/datarows/datawithcount?className=Zadavaci_postup_hist"

# Phase 1: known-good attributes (from existing scripts)
# Phase 2: extra guesses sent one-by-one in probe_extras()
KNOWN_ATTRIBUTES = [
    {"clientName": "id",                  "serverName": "ID"},
    {"clientName": "kod",                 "serverName": "Kod"},
    {"clientName": "nazev",               "serverName": "Nazev"},
    {"clientName": "stavZP",              "serverName": "Stav_ZP"},
    {"clientName": "zadavatelNazev",      "serverName": "Zadavatel.Nazev"},
    {"clientName": "podaniLhuta",         "serverName": "Podani_nabidka.Lhuta"},
    {"clientName": "createCas",           "serverName": "create_cas"},
    {"clientName": "popisPredmet",        "serverName": "Popis_predmetu"},
    {"clientName": "typVZ",               "serverName": "Typ_VZ_uziv"},
    {"clientName": "druhVZ",              "serverName": "Druh_VZ"},
    {"clientName": "druhZRNazev",         "serverName": "Druh_ZR.Nazev"},
    {"clientName": "specifZRNazev",       "serverName": "Specif_ZR.Nazev"},
    {"clientName": "predpokladHodnota",   "serverName": "Predpokl_hodnota"},
    {"clientName": "predpokladMenaNazev", "serverName": "Predpoklada_mena.Nazev"},
    {"clientName": "datumProfil",         "serverName": "Datum_uver_profil"},
    {"clientName": "datumUkonceni",       "serverName": "Datum_ukonceni"},
    {"clientName": "datumZruseni",        "serverName": "Datum_zruseni_ZR"},
    {"clientName": "osobaJmeno",          "serverName": "Osoba_zadavat.Jmeno"},
    {"clientName": "osobaPrijmeni",       "serverName": "Osoba_zadavat.Prijmeni"},
    {"clientName": "osobaEmail",          "serverName": "Osoba_zadavat.Email"},
    {"clientName": "osobaTelefon",        "serverName": "Osoba_zadavat.Telefon_zam"},
    {"clientName": "osobaMobil",          "serverName": "Osoba_zadavat.Mobil"},
    {"clientName": "cpvPredmetuKod",      "serverName": "CPV_predmetu.Kod"},
    {"clientName": "cpvPredmetuNazev",    "serverName": "CPV_predmetu.Nazev"},
    {"clientName": "nipezPredmetuKod",    "serverName": "NIPEZ_predmetu.Kod"},
    {"clientName": "nipezPredmetuNazev",  "serverName": "NIPEZ_predmetu.Nazev"},
    {"clientName": "hlavniMistoNUTS",     "serverName": "Hlavni_misto_nuts.Nazev"},
    {"clientName": "mistoPlneni",         "serverName": "Misto_plneni"},
    {"clientName": "rozdeleniNaCasti",    "serverName": "Rozdeleni_na_casti"},
    {"clientName": "jeToRD",              "serverName": "Jedna_se_o_RD"},
    {"clientName": "zadavanaDNS",         "serverName": "Zadavana_v_DNS"},
    {"clientName": "importovanaZakazka",  "serverName": "Importovana_zakazka"},
    {"clientName": "kodEU",               "serverName": "Evid_c_Uv_EU"},
    {"clientName": "identifEU",           "serverName": "Identifikator_EU"},
    {"clientName": "kodZakazkaProfil",    "serverName": "Kod_na_profil"},
    {"clientName": "nazevPredmetu",       "serverName": "Nazev_predmetu"},
    {"clientName": "zadavatelID",         "serverName": "Zadavatel"},
    {"clientName": "kodVestnik",          "serverName": "Evid_c_ve_Vestniku"},
    {"clientName": "datumVestnik",        "serverName": "Datum_uver_vestnik"},
    {"clientName": "naZakladeRSRD",       "serverName": "Na_zaklade_RS"},
    {"clientName": "zavedeniDNS",         "serverName": "Zavedeni_DNS"},
    {"clientName": "histId",              "serverName": "Hist"},
]

# Extra candidate attributes — probed one-by-one
EXTRA_CANDIDATES = [
    {"clientName": "podaniLhutaCas",      "serverName": "Podani_nabidka.Lhuta_cas"},
    {"clientName": "podaniCas",           "serverName": "Podani_nabidka.Cas"},
    {"clientName": "podaniDatum",         "serverName": "Podani_nabidka.Datum"},
    {"clientName": "podaniLhutaZona",     "serverName": "Podani_nabidka.Lhuta_zona"},
    {"clientName": "podaniLhutaTime",     "serverName": "Podani_nabidka.Lhuta_time"},
    {"clientName": "zadavatelZeme",       "serverName": "Zadavatel.Zeme"},
    {"clientName": "zadavatelZemeNazev",  "serverName": "Zadavatel.Zeme.Nazev"},
    {"clientName": "zadavatelStat",       "serverName": "Zadavatel.Stat"},
    {"clientName": "zadavatelStatNazev",  "serverName": "Zadavatel.Stat.Nazev"},
    {"clientName": "jazyk",               "serverName": "Jazyk"},
    {"clientName": "jazykNazev",          "serverName": "Jazyk.Nazev"},
    {"clientName": "jazykZadavatele",     "serverName": "Jazyk_zadavatele"},
    {"clientName": "zemeUverejneni",      "serverName": "Zeme_uverejneni"},
    {"clientName": "nutsKod",             "serverName": "Hlavni_misto_nuts.Kod"},
    {"clientName": "nutsZeme",            "serverName": "Hlavni_misto_nuts.Zeme"},
    {"clientName": "timezone",            "serverName": "Timezone"},
    {"clientName": "casovaPasma",         "serverName": "Casova_pasma"},
]


def get_session():
    session = requests.Session()
    session.headers.update({
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/145.0.0.0 Safari/537.36',
        'Accept': 'application/json, text/plain, */*',
    })
    session.get('https://nen.nipez.cz/en/verejne-zakazky', timeout=30)
    xsrf = session.cookies.get('XSRF-TOKEN-Client', '')
    if not xsrf:
        print("ERROR: Could not get XSRF token")
        sys.exit(1)
    print(f"Session OK | XSRF: {xsrf[:20]}...")
    return session, xsrf


def fetch_page(session, xsrf, keyword, attributes, count=5):
    payload = {
        'className': 'Zadavaci_postup_hist',
        'attributes': attributes,
        'condition': '(Hierarchie = null and Posledni_uverejneni = true)',
        'conditionParams': [],
        'count': count,
        'isLoadMore': True,
        'startIndex': 0,
        'orderBy': ['DESC create_cas'],
        'query': keyword,
        'abortSignal': {}
    }
    r = session.post(API_URL, json=payload, headers={
        'X-XSRF-TOKEN': xsrf,
        'Language': 'EN',
        'Origin': 'https://nen.nipez.cz',
        'Content-Type': 'application/json',
    }, timeout=60)
    return r.status_code, r.json() if r.status_code == 200 else {}


if __name__ == '__main__':
    print(f"Keyword: '{KEYWORD}'")
    print("=" * 70)

    session, xsrf = get_session()
    data = fetch_one_page(session, xsrf, KEYWORD)

    collection = data.get('collection', [])
    total      = data.get('totalCount', '?')
    print(f"Total matches: {total} | Returned: {len(collection)}")
    print("=" * 70)

    if not collection:
        print("No results.")
        sys.exit(0)

    # --- print FIRST record: every key and its value ---
    first = collection[0]
    print("\n>>> FIRST RECORD — ALL KEYS RETURNED BY API:\n")
    for key, val in first.items():
        print(f"  {key:35s} = {val!r}")

    # --- check specifically for the fields we care about ---
    print("\n" + "=" * 70)
    print(">>> FIELD CHECK:\n")
    checks = {
        "country":           ["zadavatelZeme", "zadavatelZemeNazev", "zadavatelStat",
                              "zadavatelStatNazev", "nutsZeme", "zemeUverejneni"],
        "deadline date":     ["podaniLhuta", "podaniDatum"],
        "deadline time":     ["podaniLhutaCas", "podaniLhutaTime", "podaniCas"],
        "deadline timezone": ["podaniLhutaZona", "timezone", "casovaPasma"],
        "language":          ["jazyk", "jazykNazev", "jazykZadavatele"],
        "CPV code":          ["cpvPredmetuKod", "cpvPredmetuNazev"],
    }
    for label, keys in checks.items():
        found = {k: first.get(k) for k in keys if k in first}
        present = {k: v for k, v in found.items() if v not in (None, '', [])}
        if present:
            print(f"  [FOUND]   {label}: {present}")
        elif found:
            print(f"  [EMPTY]   {label}: keys exist but all null/empty -> {list(found.keys())}")
        else:
            print(f"  [MISSING] {label}: none of {keys} returned by API")

    # --- also dump all 5 records as pretty JSON to a file ---
    out_path = os.path.join(os.path.dirname(__file__), 'nipez_test_fields_output.json')
    with open(out_path, 'w', encoding='utf-8') as f:
        json.dump(collection, f, ensure_ascii=False, indent=2)
    print(f"\nFull output saved to: {out_path}")
