<?php
/**
 * Dışlab XML'sından test kodlarını parse edip lokal testlere ekle ve eşleştir
 * Kullanım: php seed_local_tests_from_xml.php
 */

require_once __DIR__ . '/vendor/autoload.php';

$envFile = __DIR__ . '/.env';
if (file_exists($envFile)) {
    $dotenv = Dotenv\Dotenv::createImmutable(__DIR__);
    $dotenv->safeLoad();
}

use App\Database;

$pdo = Database::getConnection();

// XML data - BURADA KENDİ ÖRNEK XML'İNİZİ YAPISTIRIN
$xmlData = <<<'XML'
<?xml version="1.0"?>
<HastaSorguCevapReferans xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Tetkikler>
    <TestSonuc>
      <Adi>LÖKOSİT</Adi>
      <Kodu>C01</Kodu>
      <ReferansMin>4.0</ReferansMin>
      <ReferansMax>10.0</ReferansMax>
      <Birim>x10^3/uL</Birim>
    </TestSonuc>
    <TestSonuc>
      <Adi>ERİTROSİT</Adi>
      <Kodu>C02</Kodu>
      <ReferansMin>3.90</ReferansMin>
      <ReferansMax>5.10</ReferansMax>
      <Birim>x10^6/uL</Birim>
    </TestSonuc>
    <TestSonuc>
      <Adi>HEMOGLOBİN</Adi>
      <Kodu>C03</Kodu>
      <ReferansMin>12.0</ReferansMin>
      <ReferansMax>16.0</ReferansMax>
      <Birim>g/dL</Birim>
    </TestSonuc>
    <TestSonuc>
      <Adi>KAN ŞEKERİ</Adi>
      <Kodu>B1098</Kodu>
      <ReferansMin>80</ReferansMin>
      <ReferansMax>115</ReferansMax>
      <Birim>mg/dL</Birim>
    </TestSonuc>
    <TestSonuc>
      <Adi>ÜRE(GİRİŞ)</Adi>
      <Kodu>HD02</Kodu>
      <ReferansMin>10</ReferansMin>
      <ReferansMax>50</ReferansMax>
      <Birim>mg/dL</Birim>
    </TestSonuc>
    <TestSonuc>
      <Adi>KREATİNİN(GİRİŞ)</Adi>
      <Kodu>HD010</Kodu>
      <ReferansMin>0.5</ReferansMin>
      <ReferansMax>1.3</ReferansMax>
      <Birim>mg/dL</Birim>
    </TestSonuc>
  </Tetkikler>
</HastaSorguCevapReferans>
XML;

try {
    // XML'i parse et
    libxml_use_internal_errors(true);
    $xml = simplexml_load_string($xmlData);
    
    if (!$xml) {
        throw new Exception('XML parse hatası: ' . implode(', ', libxml_get_errors()));
    }

    $insertedTests = [];
    $mappedTests = [];
    $errors = [];

    // Her test için
    foreach ($xml->Tetkikler->TestSonuc as $test) {
        $externalCode = (string)$test->Kodu;
        $testName = (string)$test->Adi;
        $minRef = (string)$test->ReferansMin ?: null;
        $maxRef = (string)$test->ReferansMax ?: null;
        $unit = (string)$test->Birim ?: null;

        // Lokal kod oluştur (DISLAB- + dışlab kodu)
        $localCode = 'DISLAB-' . $externalCode;

        try {
            // Lokal testi ekle veya güncelle
            $stmt = $pdo->prepare('
                INSERT INTO local_test_definitions 
                (code, name, unit, min_ref, max_ref, category, is_active)
                VALUES (:code, :name, :unit, :min, :max, :cat, 1)
                ON DUPLICATE KEY UPDATE 
                name=VALUES(name), unit=VALUES(unit), min_ref=VALUES(min_ref), max_ref=VALUES(max_ref), updated_at=CURRENT_TIMESTAMP
            ');
            
            $stmt->execute([
                ':code' => $localCode,
                ':name' => $testName,
                ':unit' => $unit,
                ':min' => $minRef,
                ':max' => $maxRef,
                ':cat' => 'Dışlab'
            ]);

            $insertedTests[] = [
                'external_code' => $externalCode,
                'local_code' => $localCode,
                'name' => $testName
            ];

            echo "✓ Test eklendi: {$localCode} ({$testName})\n";

        } catch (PDOException $e) {
            $errors[] = "Test {$externalCode} eklenirken hata: " . $e->getMessage();
            echo "✗ Hata: {$externalCode} - " . $e->getMessage() . "\n";
        }
    }

    // Şimdi external_lab_services'den dışlab testlerini bul ve eşleştir
    // BUNU YAPABİLMEK İÇİN external_lab_services'de de uygun kodlar olmalı
    
    echo "\n=== DIŞLAB SERVİSLERİ İLE OTOMATİK EŞLEŞTIRME ===\n\n";

    foreach ($insertedTests as $test) {
        $externalCode = $test['external_code'];
        $localCode = $test['local_code'];
        $testName = $test['name'];

        // Dışlab servisinde bu kodu bul
        $stmt = $pdo->prepare('
            SELECT id FROM external_lab_services 
            WHERE service_code = :code 
            LIMIT 1
        ');
        $stmt->execute([':code' => $externalCode]);
        $service = $stmt->fetch(PDO::FETCH_ASSOC);

        if ($service) {
            // Eşleştir
            $mapStmt = $pdo->prepare('
                INSERT INTO external_lab_service_mappings 
                (external_lab_service_id, local_test_code, local_test_name, auto_import)
                VALUES (:sid, :code, :name, 1)
                ON DUPLICATE KEY UPDATE 
                local_test_code=VALUES(local_test_code), 
                local_test_name=VALUES(local_test_name), 
                auto_import=1,
                updated_at=CURRENT_TIMESTAMP
            ');
            $mapStmt->execute([
                ':sid' => $service['id'],
                ':code' => $localCode,
                ':name' => $testName
            ]);

            $mappedTests[] = [
                'external_code' => $externalCode,
                'local_code' => $localCode,
                'name' => $testName
            ];

            echo "✓ Eşleşti: {$externalCode} → {$localCode} ({$testName})\n";
        } else {
            echo "⚠ Dışlab'da bulunamadı: {$externalCode}\n";
        }
    }

    echo "\n=== ÖZET ===\n";
    echo "Eklenen lokal testler: " . count($insertedTests) . "\n";
    echo "Otomatik eşleştirilen: " . count($mappedTests) . "\n";
    
    if (!empty($errors)) {
        echo "\nHatalar:\n";
        foreach ($errors as $err) {
            echo "  - {$err}\n";
        }
    }

} catch (Exception $e) {
    echo "✗ Hata: " . $e->getMessage() . "\n";
    exit(1);
}

echo "\n✓ İşlem tamamlandı!\n";
echo "\nNotlar:\n";
echo "- Lokal testler 'DISLAB-' ön ekiyle oluşturuldu\n";
echo "- Dışlab test kodları ile otomatik eşleştirildi\n";
echo "- Henüz dışlab'da olmayan testler uyarı verdi\n";
echo "- Kullanıcı manuel olarak dislab-testler.php'de diğer eşleştirmeleri yapabilir\n";
?>
