<?php
declare(strict_types=1);

/**
 * export_archive_csv_v2.php
 *
 * Senin mevcut DB yapına uyumlu export:
 * - db.php içindeki $pdo bağlantısını kullanır (db() yoksa kendisi sarar)
 * - a3_jobs.status='done' kayıtlarını okur
 * - params_json içindeki c="B2195" mantığı:
 *      -> 2195. satır / B sütunu (tüm sheet'lerde aynı kural)
 * - result_json formatı: {"results":[{"b":"Arnavutköy","ihh_verisi":"..."} ...], ...}
 *      -> her "b" ayrı sheet
 * - sheet_ok / sheet_error için de ayrı CSV üretir (istersen kapatabilirsin)
 *
 * Çıktı:
 *   exports/YYYYmmdd_HHMMSS/<sheet>.csv
 *   (CSV: UTF-8 BOM + ';' ayracı, 3000 satır, 2 kolon: A ve B)
 *
 * İsteğe bağlı:
 *   csv_to_xlsx.py varsa, export sonunda tek XLSX üretir.
 */

// =====================
// AYARLAR
// =====================
const EXPORT_BASE_DIR = __DIR__ . '/exports';
const FIXED_ROWS = 3000;                 // Excel dosyandaki gibi 3000 satır
const FIXED_COLS = 2;                    // A,B
const INCLUDE_SHEET_OK_ERROR = true;     // sheet_ok / sheet_error csv üret
const RUN_PYTHON_XLSX = true;            // python ile tek XLSX üret
const PYTHON_BIN = 'python';
const PYTHON_SCRIPT = __DIR__ . '/csv_to_xlsx.py';
const XLSX_OUTPUT_NAME = 'archive.xlsx';

// =====================
// DB BAĞLANTISI
// =====================
require_once __DIR__ . '/db.php'; // zip içindeki db.php

if (!function_exists('db')) {
    // db.php sadece $pdo tanımlıyorsa onu sar.
    function db(): PDO {
        global $pdo;
        if (!($pdo instanceof PDO)) {
            throw new RuntimeException("db.php içinde PDO bağlantısı bulunamadı (\$pdo yok).");
        }
        return $pdo;
    }
}

// =====================
// HELPER
// =====================
function colLettersToIndex(string $letters): int {
    $letters = strtoupper(trim($letters));
    $n = 0;
    for ($i=0; $i<strlen($letters); $i++) {
        $ch = ord($letters[$i]) - 64; // 'A'=1
        if ($ch < 1 || $ch > 26) return 0;
        $n = $n * 26 + $ch;
    }
    return $n;
}
function parseCell(string $cell): array {
    $cell = trim($cell);
    if (!preg_match('/^([A-Za-z]{1,3})(\d{1,7})$/', $cell, $m)) return [0,0];
    $col = colLettersToIndex($m[1]);
    $row = (int)$m[2];
    return [$row, $col];
}
function safeName(string $s): string {
    $s = trim($s);
    $s = preg_replace('/[^\pL\pN\-_ ]+/u', '_', $s);
    $s = preg_replace('/\s+/', ' ', $s);
    $s = trim($s);
    if ($s === '') $s = 'sheet';
    // dosya adı için kısa tut
    return mb_substr($s, 0, 60, 'UTF-8');
}

/**
 * result_json decode:
 * - {"results":[...]}  -> döndür results
 * - [...]              -> direkt döndür
 * - {"0":..., "1":...} -> numerik key'li objeyi diziye çevir
 */
function extractResults($decoded): array {
    if (!is_array($decoded)) return [];
    if (isset($decoded['results']) && is_array($decoded['results'])) return $decoded['results'];

    // numerik key'li associative mi?
    $allNumeric = true;
    foreach (array_keys($decoded) as $k) {
        if (!is_int($k) && !ctype_digit((string)$k)) { $allNumeric = false; break; }
    }
    if ($allNumeric) {
        // sıralı diziye çevir
        $out = [];
        foreach ($decoded as $v) $out[] = $v;
        return $out;
    }
    return [];
}

// =====================
// EXPORT
// =====================
$pdo = db();

$ts = date('Ymd_His');
$baseDir = EXPORT_BASE_DIR . '/' . $ts;
if (!is_dir($baseDir) && !mkdir($baseDir, 0775, true)) {
    throw new RuntimeException("EXPORT klasörü oluşturulamadı: $baseDir");
}
echo "Export klasörü: $baseDir\n";

$sql = "SELECT id, params_json, result_json, sheet_ok, sheet_error
        FROM a3_jobs
        WHERE status='done'
        ORDER BY id ASC";
$st = $pdo->query($sql);

$sheets = []; // sheetName => [row => [col => val]]
$dates  = []; // sheetName => [row => date]
$maxRowTouched = 0;

$doneJobs = 0;
$writtenCells = 0;
$skippedNoCell = 0;
$skippedNoResults = 0;

while ($r = $st->fetch(PDO::FETCH_ASSOC)) {
    $doneJobs++;

    $params = json_decode((string)$r['params_json'], true);
    if (!is_array($params)) { $skippedNoCell++; continue; }

    $cell = (string)($params['c'] ?? '');
    [$row, $col] = parseCell($cell);
    if ($row <= 0 || $col <= 0) { $skippedNoCell++; continue; }

    if ($row > $maxRowTouched) $maxRowTouched = $row;

    // tarih istersek A sütununa
    $date = null;
    if (!empty($params['date_a'])) $date = (string)$params['date_a'];
    elseif (!empty($params['date_b'])) $date = (string)$params['date_b'];

    // result_json -> results
    $decoded = json_decode((string)$r['result_json'], true);
    $results = extractResults($decoded);
    if (!$results) { $skippedNoResults++; }

    foreach ($results as $it) {
        if (!is_array($it)) continue;

        $b = (string)($it['b'] ?? '');
        if ($b === '') continue;

        // değer alanı
        $val = null;
        if (array_key_exists('ihh_verisi', $it)) $val = (string)$it['ihh_verisi'];
        elseif (array_key_exists('value', $it)) $val = (string)$it['value'];
        elseif (array_key_exists('v', $it)) $val = (string)$it['v'];

        if ($val === null) continue;

        if (!isset($sheets[$b])) $sheets[$b] = [];
        if (!isset($sheets[$b][$row])) $sheets[$b][$row] = [];
        $sheets[$b][$row][$col] = $val;
        $writtenCells++;

        if ($date !== null) {
            if (!isset($dates[$b])) $dates[$b] = [];
            $dates[$b][$row] = $date; // A kolonu
        }
    }

    // sheet_ok / sheet_error özel sheet'ler
    if (INCLUDE_SHEET_OK_ERROR) {
        // sheet_ok
        $bname = "sheet_ok";
        if (!isset($sheets[$bname])) $sheets[$bname] = [];
        if (!isset($sheets[$bname][$row])) $sheets[$bname][$row] = [];
        $sheets[$bname][$row][2] = ($r['sheet_ok'] === null) ? '' : (string)((int)$r['sheet_ok']); // B kolonu

        // sheet_error
        $bname2 = "sheet_error";
        if (!isset($sheets[$bname2])) $sheets[$bname2] = [];
        if (!isset($sheets[$bname2][$row])) $sheets[$bname2][$row] = [];
        $sheets[$bname2][$row][2] = (string)($r['sheet_error'] ?? '');
    }

    // replayed_from gibi log sheet istersen burada eklenir
}

echo "DONE job: $doneJobs\n";
echo "Toplam hücre yazımı: $writtenCells\n";
echo "Sheet sayısı: " . count($sheets) . "\n";
echo "Cell parse atlanan: $skippedNoCell\n";
echo "Result parse boş olan job: $skippedNoResults\n";

if (!$sheets) {
    echo "Export edilecek veri yok.\n";
    exit(0);
}

// CSV yazma (UTF-8 BOM + ;)
// NOT: Senin örnekte header yok, ilk satır boş. Biz de header koymuyoruz.
foreach ($sheets as $sheetName => $grid) {
    $file = $baseDir . '/' . safeName($sheetName) . '.csv';
    $fp = fopen($file, 'wb');
    if (!$fp) {
        echo "Yazılamadı: $file\n";
        continue;
    }
    fwrite($fp, "\xEF\xBB\xBF"); // BOM

    for ($r=1; $r<=FIXED_ROWS; $r++) {
        $rowArr = array_fill(0, FIXED_COLS, '');

        // Tarih A kolonu
        if (isset($dates[$sheetName][$r])) {
            $rowArr[0] = $dates[$sheetName][$r];
        }

        if (isset($grid[$r])) {
            foreach ($grid[$r] as $c => $v) {
                $c = (int)$c;
                if ($c < 1 || $c > FIXED_COLS) continue;
                $rowArr[$c-1] = (string)$v;
            }
        }

        fputcsv($fp, $rowArr, ';');
    }

    fclose($fp);
    echo "Yazıldı: " . basename($file) . "\n";
}

echo "\nCSV tamam: $baseDir\n";

// XLSX'e çevir (opsiyonel)
if (RUN_PYTHON_XLSX) {
    if (!is_file(PYTHON_SCRIPT)) {
        echo "Python script bulunamadı: " . PYTHON_SCRIPT . "\n";
        echo "Sadece CSV üretildi.\n";
        exit(0);
    }
    $outXlsx = $baseDir . '/' . XLSX_OUTPUT_NAME;

    $cmd = escapeshellarg(PYTHON_BIN) . " "
        . escapeshellarg(PYTHON_SCRIPT) . " "
        . escapeshellarg($baseDir) . " "
        . escapeshellarg($outXlsx);

    echo "Python çalıştırılıyor...\n";
    exec($cmd, $output, $ret);

    if ($ret !== 0) {
        echo "Python hata verdi\n";
        print_r($output);
        exit(2);
    } else {
        echo "Excel başarıyla oluşturuldu: $outXlsx\n";
    }
}
