<?php
date_default_timezone_set('Europe/Zagreb');

require_once 'db-conn.php';
$conn = $pdo;
$start_script = microtime(true);


// Dohvati trenutačno vrijeme i datum
$now = new DateTime();
$trenutnoVrijeme = $now->format('H:i:s');
$trenutniDatum = $now->format('d.m.Y');

echo "Trenutno vrijeme: $trenutniDatum $trenutnoVrijeme<br>";

// Ako je override aktivan, preskoči provjere
if (isset($_GET['override']) && $_GET['override'] === 'true') {
    echo "⚠️ Override aktivan – pristup dopušten unatoč vremenskim ograničenjima.<br>";
} else {
    $trenutniDatum = date('d.m.Y');
    $now = new DateTime();

    $dozvoljeno = false;

    // Testni podaci 28.5.2025. od 12:00 do 13:30
    if ($trenutniDatum === '28.05.2025') {
        $start = new DateTime('12:00');
        $end = new DateTime('13:30');
        if ($now >= $start && $now <= $end) {
            $dozvoljeno = true;
        }
    }

    // Produkcijski podaci 1.6.2025. od 20:00 do 23:59
    if ($trenutniDatum === '01.06.2025') {
        $start = new DateTime('20:00');
        $end = new DateTime('23:59');
        if ($now >= $start && $now <= $end) {
            $dozvoljeno = true;
        }
    }

    if (!$dozvoljeno) {
        exit('❌ Nedopušten pristup – dostupnost je ograničena na 28.5.2025. (12:00–13:30) i 1.6.2025. (20:00–23:59).');
    }
}


// Ako prođe ili je override
echo '✅ Dozvoljen pristup podacima.<hr>';




// Token provjera
if (!isset($_GET['token']) || $_GET['token'] !== '3004') {
    http_response_code(403);
    exit('❌ Unauthorized access');
}

// RUN & PROCESS   https://production.ionix.hr/istrain-loc-izbori/II_krug/fetch-apis-data-test.php?token=3004
// RUN & PROCESS & OVERRIDE  https://production.ionix.hr/istrain-loc-izbori/II_krug/fetch-apis-data-test.php?token=3004&override=true
// JUST EMPTY TABLES  https://production.ionix.hr/istrain-loc-izbori/II_krug/fetch-apis-data-test.php?token=3004&resetdb_empty=true&override=true

// Opcionalni reset baze
if (isset($_GET['resetdb_empty']) && $_GET['resetdb_empty'] === 'true') {
    $tables = ['gradovi', 'info_podaci', 'log_data', 'opcine', 'zupani'];
    foreach ($tables as $t) {
        $conn->exec("TRUNCATE TABLE $t");
    }
    exit("✅ Baza je resetirana (sve tablice su ispražnjene)<br>");
}


$tablice = ['gradovi', 'opcine', 'zupani'];

foreach ($tablice as $tablica) {
    $stmt = $conn->query("SELECT COUNT(*) FROM $tablica");
    $count = $stmt->fetchColumn();
    if ($count == 0) {
        $conn->exec("ALTER TABLE $tablica AUTO_INCREMENT = 1");
    }
}


$auth_user = 'medij028';
$auth_pass = 'Tyn1iYe5Tl7KYr8QKs';
$api_url = 'https://www.apis-it.hr:8443/izbori/';
$target_dir = '_downloads/';
$json_dir = '_downloads/json/';
$archive_dir = '_downloads_and_stay/';

if (!file_exists($target_dir)) mkdir($target_dir);
if (!file_exists($json_dir)) mkdir($json_dir);
if (!file_exists($archive_dir)) mkdir($archive_dir);

$context = stream_context_create([
  'http' => [
    'header' => 'Authorization: Basic ' . base64_encode("$auth_user:$auth_pass")
  ]
]);

$listing = @file_get_contents($api_url, false, $context);
if (!$listing) exit("❌ Ne mogu dohvatiti HTML listing s API URL-a\n<br>");

preg_match_all('/href=\"([^\"]+\.zip)\"/i', $listing, $matches);
$zip_list = $matches[1] ?? [];

if (empty($zip_list)) exit("➜ ❌ Nema dostupnih .zip datoteka u listingu\n<br>");

rsort($zip_list);
$latest_zip = basename($zip_list[0]);
$local_zip = $target_dir . $latest_zip;

if (!file_exists($local_zip)) {
    echo "➜ Preuzimam novi ZIP: $latest_zip\n<br>";
    $zip_data = file_get_contents($api_url . $latest_zip, false, $context);
    file_put_contents($local_zip, $zip_data);

    // Arhiviraj ZIP datoteku s prefiksom vremena
    $ts = date('d.m.Y-H.i.s');
    $archive_name = "dl-$ts-$latest_zip";
    $archive_path = $archive_dir . $archive_name;
    file_put_contents($archive_path, $zip_data);
    echo "➜ ZIP spremljen u arhivu kao: $archive_name<br>";
} else {
    echo "➜ ZIP već postoji lokalno: $latest_zip — preskačem preuzimanje.\n<br>";
}

array_map('unlink', glob($json_dir . '*.json'));
echo "➜ Obrisani svi prethodni JSON fajlovi iz mape $json_dir<hr>";

$zip = new ZipArchive;
if ($zip->open($local_zip) === TRUE) {
    $zip->extractTo($json_dir);
    $zip->close();
    echo "➜ ZIP uspješno ekstrahiran.\n";
} else {
    exit("❌ Ne mogu otvoriti ZIP arhivu: $latest_zip\n");
}

$files = glob($json_dir . '*.json');
$inserted = 0;
$updated = 0;
$processed = 0;
echo "<hr>";
/// obrada zupana

$zupani_glasovi = [];

$info_datum = null;
$info_vrijeme = null;
$info_obradeno = 0.0;

echo "<strong>➡ Pronađeni JSON fajlovi:</strong><br>";
foreach ($files as $json_file) {
    echo basename($json_file) . "<br>";
}
echo "<hr>";

foreach ($files as $json_file) {
    $data = json_decode(file_get_contents($json_file), true);

    // Obradi samo JEDAN JSON: r_15_18_0000_000.json (župan Istarska)
    if (
        ($data['zupSifra'] ?? '') === '18' &&
        ($data['izboriOznaka'] ?? '') === '15' &&
        ($data['gropSifra'] ?? '') === '0000' &&
        ($data['bmSifra'] ?? '') === '000'
    ) {
        if (!$info_datum && isset($data['datum'])) {
            $info_datum = DateTime::createFromFormat('d.m.Y.', $data['datum'])->format('Y-m-d');
        }
        if (!$info_vrijeme && isset($data['vrijeme'])) {
            $info_vrijeme = $data['vrijeme'];
        }
        if (isset($data['bmZatvoreno']) && isset($data['bmUkupno']) && $data['bmUkupno'] > 0) {
            $info_obradeno = round(($data['bmZatvoreno'] / $data['bmUkupno']) * 100, 2);
        }

        foreach ($data['lista'] ?? [] as $lista) {
            $ime = $lista['naziv'] ?? '';
            $glasova = intval($lista['glasova'] ?? 0);
            $stranke = implode(' + ', array_column($lista['strankePuniNaziv'] ?? [], 'naziv'));

            $replace_map = [
                'SOCIJALDEMOKRATSKA PARTIJA HRVATSKE - SDP' => 'SDP',
                'HRVATSKA SELJAČKA STRANKA - HSS' => 'HSS',
                'ISTARSKI DEMOKRATSKI SABOR - IDS' => 'IDS',
                'ISTARSKA STRANKA UMIROVLJENIKA - PARTITO ISTRIANO DEI PENSIONATI - ISU - PIP' => 'ISU - PIP',
                'HRVATSKA DEMOKRATSKA ZAJEDNICA - HDZ' => 'HDZ',
                'GRAĐANSKO-LIBERALNI SAVEZ - GLAS' => 'GLAS',
                'DOMOVINSKI POKRET - DP' => 'DP',
                'POLITIČKA PLATFORMA - MOŽEMO!' => 'MOŽEMO',
                'MOŽEMO! - MOŽEMO' => 'MOŽEMO',
                'KANDIDAT GRUPE BIRAČA' => 'NEZAVISNI',
                'STRANKA UMIROVLJENIKA - SU' => 'SU',
                'KANDIDATI GRUPE BIRAČA' => 'NEZAVISNI'
            ];
            $stranke = str_replace(array_keys($replace_map), array_values($replace_map), $stranke);

            foreach (['Boris Miletić', 'Sanja Radolović'] as $kandidat) {
                if (str_contains(mb_strtolower($ime), mb_strtolower($kandidat))) {
                    if (!isset($zupani_glasovi[$kandidat])) {
                        $zupani_glasovi[$kandidat] = ['glasova' => 0, 'stranka' => $stranke];
                    }
                    $zupani_glasovi[$kandidat]['glasova'] += $glasova;
                    $zupani_glasovi[$kandidat]['stranka'] = $stranke;
                }
            }
        }
    }
}


// Izračun postotaka i upis u tablicu:
$total = array_sum(array_column($zupani_glasovi, 'glasova'));

foreach ($zupani_glasovi as $kandidat => $podaci) {
    $glasova = $podaci['glasova'];
    $stranka = $podaci['stranka'];
    $postotak = $total > 0 ? round($glasova / $total * 100, 2) : 0;

    echo "➡ ZUPANI ➜ $kandidat ➜ $glasova glasova ➜ $postotak%<br>";

    // Provjeri postoji li već zapis
    $stmt = $pdo->prepare("SELECT COUNT(*) FROM zupani WHERE kandidat = ?");
    $stmt->execute([$kandidat]);
    $exists = $stmt->fetchColumn();

    if ($exists) {
        $stmt = $pdo->prepare("UPDATE zupani SET broj_glasova = ?, postotak = ?, stranka = ? WHERE kandidat = ?");
        $stmt->execute([$glasova, $postotak, $stranka, $kandidat]);
    } else {
        $stmt = $pdo->prepare("INSERT INTO zupani (kandidat, stranka, postotak, broj_glasova) VALUES (?, ?, ?, ?)");
      $stmt->execute([mb_strtoupper($kandidat), $stranka, $postotak, $glasova]);

    }
}

// INSERT/UPDATE u tablicu info_podaci
// Akumulirani podaci o biračima i izlaznosti u tablicu info_podaci
$datum = $info_datum ?? date('Y-m-d');
$vrijeme = $info_vrijeme ?? date('H:i');
$obradeno = $info_obradeno;
$naslov = "II. KRUG - Rezultati lokalnih izbori 2025. - Istarska županija";

// Računaj ukupan broj birača i izašlih
$biraci_ukupno = 0;
$biraci_glasovalo = 0;

foreach ($files as $json_file) {
    $data = json_decode(file_get_contents($json_file), true);
    if (($data['zupSifra'] ?? '') !== '18') continue;
    if (($data['izboriOznaka'] ?? '') !== '15') continue;

    $biraci_ukupno += intval($data['biraciUkupno'] ?? 0);
    $biraci_glasovalo += intval($data['biraciGlasovalo'] ?? 0);
}

$broj_biraca = $biraci_glasovalo;
$izlaznost = ($biraci_ukupno > 0) ? round($biraci_glasovalo / $biraci_ukupno * 100, 2) : 0;

// Upis u tablicu info_podaci
$stmt = $pdo->query("SELECT COUNT(*) FROM info_podaci");
$exists = $stmt->fetchColumn();

if ($exists) {
    $stmt = $pdo->prepare("UPDATE info_podaci SET datum = ?, vrijeme = ?, izlaznost = ?, broj_biraca = ?, obradeno = ?, naslov = ?, azurirano_at = NOW() WHERE id = 1");
    $stmt->execute([$datum, $vrijeme, $izlaznost, $broj_biraca, $obradeno, $naslov]);
} else {
    $stmt = $pdo->prepare("INSERT INTO info_podaci (id, datum, vrijeme, izlaznost, broj_biraca, obradeno, naslov, azurirano_at) VALUES (1, ?, ?, ?, ?, ?, ?, NOW())");
    $stmt->execute([$datum, $vrijeme, $izlaznost, $broj_biraca, $obradeno, $naslov]);
}

echo "<hr>";
echo "🗳️ INFO PODACI<br>";
echo "• Datum: $datum<br>";
echo "• Vrijeme: $vrijeme<br>";
echo "• Ukupno birača: $biraci_ukupno<br>";
echo "• Izašlo na izbore: $broj_biraca<br>";
echo "• Izlaznost: $izlaznost%<br>";
echo "• Obrađeno: $obradeno%<br>";



// obrada gradova i opcina
echo "<hr>";

$map = [
  '0434' => ['BUZET', ['Damir Kajin', 'Vedran Majcan']],
  '3590' => ['PULA', ['Filip Zoričić', 'Peđa Grbin']],
  '3212' => ['PAZIN', ['Suzana Jašić', 'Endi Rimanić']],
  '0060' => ['Barban', ['Andi Kalčić', 'Vedran Batel']],
  '2542' => ['Marčana', ['Predrag Pliško', 'Diego Biljuh']],
  '5169' => ['Vrsar', ['Tina Slamar', 'Zoran Kalčić']],
  '5312' => ['Žminj', ['Željko Plavčić', 'Tomislav Galant']],
  '2178' => ['Kršan', ['Ana Vuksan', 'Roman Carić']]
];

foreach ($files as $json_file) {
    $data = json_decode(file_get_contents($json_file), true);
    if (($data['zupSifra'] ?? '') !== '18') continue;

    $oznaka = $data['izboriOznaka'] ?? '';
    $zip_filename = basename($local_zip);
    $json_filename = basename($json_file);
    $sifra = $data['gropSifra'] ?? '';
    $naziv = $data['gropNaziv'] ?? '';
    $start = microtime(true);
    $records = 0;
    $status = 'SUCCESS';
    $msg = '';

    if (!isset($map[$sifra])) continue;
    list($mjesto, $kandidati) = $map[$sifra];
    $table = in_array($mjesto, ['Barban', 'Marčana', 'Vrsar', 'Žminj', 'Kršan']) ? 'opcine' : 'gradovi';
    $mjesto_col = $table === 'opcine' ? 'opcina' : 'grad';

    foreach (($data['lista'] ?? []) as $lista) {
        $ime = $lista['naziv'] ?? '';
        
        $stranke = implode(' + ', array_column($lista['strankePuniNaziv'] ?? [], 'naziv'));

          $glasova = intval($lista['glasova'] ?? 0);
$listici_vazeci = intval($data['listiciVazeci'] ?? 0);
$postotak = ($listici_vazeci > 0) ? round(($glasova / $listici_vazeci) * 100, 2) : 0;


// Skrati naziv stranke
$replace_map = [
  'SOCIJALDEMOKRATSKA PARTIJA HRVATSKE - SDP' => 'SDP',
  'HRVATSKA SELJAČKA STRANKA - HSS' => 'HSS',
  'ISTARSKI DEMOKRATSKI SABOR - IDS' => 'IDS',
  'ISTARSKA STRANKA UMIROVLJENIKA - PARTITO ISTRIANO DEI PENSIONATI - ISU - PIP' => 'ISU - PIP',
  'HRVATSKA DEMOKRATSKA ZAJEDNICA - HDZ' => 'HDZ',
  'GRAĐANSKO-LIBERALNI SAVEZ - GLAS' => 'GLAS',
  'DOMOVINSKI POKRET - DP' => 'DP',
  'POLITIČKA PLATFORMA - MOŽEMO!' => 'MOŽEMO',
  'MOŽEMO! - MOŽEMO' => 'MOŽEMO',
  'KANDIDAT GRUPE BIRAČA' => 'NEZAVISNI',
  'STRANKA UMIROVLJENIKA - SU'=> 'SU',
  'KANDIDATI GRUPE BIRAČA' => 'NEZAVISNI'
];
$stranke = str_replace(array_keys($replace_map), array_values($replace_map), $stranke);



        foreach ($kandidati as $target) {
     

            if (str_contains(mb_strtolower($ime), mb_strtolower($target))) {
                echo "➡ $table ➜ " . mb_strtoupper($mjesto) . " ➜ $ime<br>";
                
                // Provjeri postoji li već zapis
                $stmt = $pdo->prepare("SELECT COUNT(*) FROM $table WHERE $mjesto_col = ? AND kandidat = ?");
                $stmt->execute([$mjesto, $ime]);
                $exists = $stmt->fetchColumn();

                if ($exists) {
                    $stmt = $pdo->prepare("UPDATE $table SET postotak = ?, broj_glasova = ?, stranka = ? WHERE kandidat = ? AND $mjesto_col = ?");
                    $stmt->execute([$postotak, $glasova, $stranke, $ime, mb_strtoupper($mjesto)]);

                    $updated++;
                } else {
                   $redoslijed = null;

if ($table === 'gradovi') {
    $redoslijed_map = [
        'PULA' => 1,
        'PAZIN' => 2,
        'BUZET' => 3
    ];
    $redoslijed = $redoslijed_map[mb_strtoupper($mjesto)] ?? null;
} elseif ($table === 'opcine') {
    $redoslijed_map = [
        'BARBAN' => 1,
        'MARČANA' => 2,
        'VRSAR' => 3,
        'ŽMINJ' => 4,
        'KRŠAN' => 5
    ];
    $redoslijed = $redoslijed_map[mb_strtoupper($mjesto)] ?? null;
}

if ($redoslijed !== null) {
    $stmt = $pdo->prepare("INSERT INTO $table ($mjesto_col, kandidat, stranka, postotak, broj_glasova, redoslijed) VALUES (?, ?, ?, ?, ?, ?)");
    $stmt->execute([mb_strtoupper($mjesto), $ime, $stranke, $postotak, $glasova, $redoslijed]);

} else {
    $stmt = $pdo->prepare("INSERT INTO $table ($mjesto_col, kandidat, stranka, postotak, broj_glasova) VALUES (?, ?, ?, ?, ?)");
$stmt->execute([mb_strtoupper($mjesto), $ime, $stranke, $postotak, $glasova]);
}

                    $inserted++;
                }

                $records++;
                break;
            }
        }
    }

    $duration = round((microtime(true) - $start) * 1000);
    $stmt = $pdo->prepare("INSERT INTO log_data (zip_filename, processed_json, type, status, message, records_updated, duration_ms) VALUES (?, ?, ?, ?, ?, ?, ?)");
    $stmt->execute([$zip_filename, $json_filename, $oznaka, $status, $msg, $records, $duration]);
    $processed++;
}

echo "<hr>➜ Analizirano JSON datoteka: $processed\n<br>";
echo "➜ Ukupno INSERTA: $inserted<br>➜ Ukupno UPDATEA: $updated<br>";
array_map('unlink', glob($json_dir . '*.json'));
echo "➜ Obrisani svi JSON fajlovi iz mape $json_dir nakon obrade.<hr>";
echo "➜ Završeno.\n<br>";
$end_script = microtime(true);
$elapsed_ms = round(($end_script - $start_script) * 1000);
echo "⏱️ Ukupno trajanje skripte: {$elapsed_ms} ms<br>";