<?php
require_once 'config.php';
require_once 'includes/Database.php';
require_once 'includes/Auth.php';
require_once 'vendor/autoload.php';

use PhpOffice\PhpSpreadsheet\IOFactory;
use PhpOffice\PhpSpreadsheet\Shared\Date as ExcelDate;

Auth::requireAdmin();

$db = new Database();

// AJAX önizleme isteği - header.php'den ÖNCE kontrol et
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action']) && $_POST['action'] === 'preview') {
    header('Content-Type: application/json');
    try {
        $file = $_FILES['excel_file'];

        if ($file['error'] !== UPLOAD_ERR_OK) {
            throw new Exception('Dosya yüklenirken bir hata oluştu.');
        }

        $fileExtension = strtolower(pathinfo($file['name'], PATHINFO_EXTENSION));
        if (!in_array($fileExtension, ['xlsx', 'xls', 'csv'])) {
            throw new Exception('Sadece Excel dosyaları (.xlsx, .xls, .csv) yüklenebilir.');
        }

        // Excel dosyasını yükle
        $spreadsheet = IOFactory::load($file['tmp_name']);
        $worksheet = $spreadsheet->getActiveSheet();

        // Başlık satırını al
        $headers = $worksheet->rangeToArray('A1:G1')[0];

        // Tarih formatını koruyarak satırları oku
        $previewRows = [];
        $totalRows = 0;
        $previewCount = 0;

        foreach ($worksheet->getRowIterator(2) as $row) {
            $cellIterator = $row->getCellIterator();
            $cellIterator->setIterateOnlyExistingCells(false);

            $rowData = [];
            $isEmpty = true;

            foreach ($cellIterator as $cell) {
                $columnIndex = $cell->getColumn();
                if ($columnIndex > 'G') break; // Sadece A-G sütunları

                $value = $cell->getValue();

                // E sütunu (Eğitim Tarihi) için özel formatla
                if ($columnIndex === 'E' && !empty($value)) {
                    if (is_numeric($value) && $value > 0) {
                        try {
                            $dateObj = \PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject($value);
                            $value = $dateObj->format('d.m.Y');
                        } catch (Exception $e) {
                            // Formatlanamadıysa olduğu gibi bırak
                        }
                    }
                }

                $rowData[] = $value;
                if (!empty($value)) $isEmpty = false;
            }

            // Boş satırları ve örnek satırları atla
            $companyId = trim($rowData[0] ?? '');
            if (!$isEmpty && !in_array($companyId, ['FRM001', 'FRM002', ''])) {
                $totalRows++;
                if ($previewCount < 10) {
                    $previewRows[] = $rowData;
                    $previewCount++;
                }
            }

            if ($previewCount >= 10 && $totalRows > 100) break; // Performans için limit
        }

        echo json_encode([
            'success' => true,
            'headers' => $headers,
            'rows' => $previewRows,
            'totalRows' => $totalRows
        ]);
        exit;
    } catch (Exception $e) {
        echo json_encode(['success' => false, 'error' => $e->getMessage()]);
        exit;
    }
}

// Header dahil et
$pageTitle = 'Eğitim Tamamlama Verisi Yükleme';
include 'includes/header.php';

$message = '';
$messageType = '';

if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['excel_file']) && !isset($_POST['action'])) {
    try {
        $file = $_FILES['excel_file'];

        // Dosya yükleme kontrolü
        if ($file['error'] !== UPLOAD_ERR_OK) {
            throw new Exception('Dosya yüklenirken bir hata oluştu.');
        }

        // Dosya uzantısı kontrolü
        $fileExtension = strtolower(pathinfo($file['name'], PATHINFO_EXTENSION));
        if (!in_array($fileExtension, ['xlsx', 'xls', 'csv'])) {
            throw new Exception('Sadece Excel dosyaları (.xlsx, .xls, .csv) yüklenebilir.');
        }

        // Excel dosyasını yükle
        $spreadsheet = IOFactory::load($file['tmp_name']);
        $worksheet = $spreadsheet->getActiveSheet();

        $successCount = 0;
        $errorCount = 0;
        $updateCount = 0;
        $errors = [];

        $rowNumber = 2; // Excel satır numarası (başlık + 1)

        foreach ($worksheet->getRowIterator(2) as $excelRow) {
            $cellIterator = $excelRow->getCellIterator();
            $cellIterator->setIterateOnlyExistingCells(false);

            // Satır verilerini oku
            $row = [];
            foreach ($cellIterator as $cell) {
                $columnIndex = $cell->getColumn();
                if ($columnIndex > 'G') break;
                $row[] = $cell->getValue();
            }

            // Boş satırları atla
            if (empty(array_filter($row))) {
                $rowNumber++;
                continue;
            }

            // Örnek verileri atla (gri renkli satırlar veya belirli firma ID'leri)
            $companyId = trim($row[0] ?? '');
            if (in_array($companyId, ['FRM001', 'FRM002', ''])) {
                $rowNumber++;
                continue;
            }

            try {
                // Excel'den verileri al
                // A: Firma ID
                // B: Firma Adı
                // C: Satış Kaynağı
                // D: Destek Temsilcisi
                // E: Eğitim Tamamlanma Tarihi
                // F: Satış Tipi
                // G: Paket Türü

                $companyId = trim($row[0] ?? '');
                $companyName = trim($row[1] ?? '');
                $salesSource = trim($row[2] ?? '');
                $supportRep = trim($row[3] ?? '');
                $trainingDate = $row[4] ?? '';
                $salesType = trim($row[5] ?? '');
                $packageType = trim($row[6] ?? '');

                // Zorunlu alanlar kontrolü
                if (empty($companyId)) {
                    throw new Exception("Firma ID boş olamaz");
                }

                if (empty($companyName)) {
                    throw new Exception("Firma Adı boş olamaz");
                }

                if (empty($salesType)) {
                    throw new Exception("Satış Tipi boş olamaz");
                }

                if (empty($packageType)) {
                    throw new Exception("Paket Türü boş olamaz");
                }

                // Tarihi düzenle
                $formattedDate = null;
                if (!empty($trainingDate)) {
                    // Excel tarih formatı (sayısal değer)
                    if (is_numeric($trainingDate) && $trainingDate > 0) {
                        try {
                            $formattedDate = ExcelDate::excelToDateTimeObject($trainingDate)->format('Y-m-d');
                        } catch (Exception $e) {
                            throw new Exception("Geçersiz tarih formatı");
                        }
                    } else {
                        // String tarih formatı
                        $trainingDate = trim($trainingDate);

                        // YYYY-MM-DD formatı - zaten doğru
                        if (preg_match('/^\d{4}-\d{2}-\d{2}$/', $trainingDate)) {
                            $formattedDate = $trainingDate;
                        }
                        // DD/MM/YYYY formatı
                        else if (preg_match('/^(\d{1,2})\/(\d{1,2})\/(\d{4})$/', $trainingDate)) {
                            $dateObj = DateTime::createFromFormat('d/m/Y', $trainingDate);
                            if (!$dateObj) {
                                throw new Exception("Geçersiz tarih formatı: '$trainingDate'");
                            }
                            $formattedDate = $dateObj->format('Y-m-d');
                        }
                        // DD.MM.YYYY formatı
                        else if (preg_match('/^(\d{1,2})\.(\d{1,2})\.(\d{4})$/', $trainingDate)) {
                            $dateObj = DateTime::createFromFormat('d.m.Y', $trainingDate);
                            if (!$dateObj) {
                                throw new Exception("Geçersiz tarih formatı: '$trainingDate'");
                            }
                            $formattedDate = $dateObj->format('Y-m-d');
                        }
                        // DD-MM-YYYY formatı
                        else if (preg_match('/^(\d{1,2})-(\d{1,2})-(\d{4})$/', $trainingDate)) {
                            $dateObj = DateTime::createFromFormat('d-m-Y', $trainingDate);
                            if (!$dateObj) {
                                throw new Exception("Geçersiz tarih formatı: '$trainingDate'");
                            }
                            $formattedDate = $dateObj->format('Y-m-d');
                        }
                        else {
                            throw new Exception("Geçersiz tarih formatı: '$trainingDate'. Desteklenen formatlar: dd.mm.yyyy, dd/mm/yyyy, yyyy-mm-dd");
                        }
                    }
                }

                // Aynı firma ID + satış tipi + paket türü kombinasyonu var mı kontrol et
                // Aynı firma farklı paketler alabilir
                $existing = $db->fetchOne(
                    "SELECT id FROM training_completion
                     WHERE company_id = ? AND sales_type = ? AND package_type = ?",
                    [$companyId, $salesType, $packageType]
                );

                if ($existing) {
                    // Güncelle (aynı kombinasyon varsa bilgileri güncelle)
                    $db->query(
                        "UPDATE training_completion SET
                            company_name = ?,
                            sales_source = ?,
                            support_representative = ?,
                            training_completion_date = ?,
                            updated_at = NOW()
                        WHERE company_id = ? AND sales_type = ? AND package_type = ?",
                        [
                            $companyName,
                            $salesSource,
                            $supportRep,
                            $formattedDate,
                            $companyId,
                            $salesType,
                            $packageType
                        ]
                    );
                    $updateCount++;
                } else {
                    // Yeni kayıt ekle (farklı paket veya farklı satış tipi)
                    $db->query(
                        "INSERT INTO training_completion
                            (company_id, company_name, sales_source, support_representative,
                             training_completion_date, sales_type, package_type)
                        VALUES (?, ?, ?, ?, ?, ?, ?)",
                        [
                            $companyId,
                            $companyName,
                            $salesSource,
                            $supportRep,
                            $formattedDate,
                            $salesType,
                            $packageType
                        ]
                    );
                    $successCount++;
                }
            } catch (Exception $e) {
                $errorCount++;
                $errors[] = "Satır $rowNumber: " . $e->getMessage();
            }

            $rowNumber++;
        }

        // Sonuç mesajı
        $messageParts = [];
        if ($successCount > 0) {
            $messageParts[] = "$successCount yeni kayıt eklendi";
        }
        if ($updateCount > 0) {
            $messageParts[] = "$updateCount kayıt güncellendi";
        }
        if ($errorCount > 0) {
            $messageParts[] = "$errorCount kayıt başarısız";
        }

        if ($successCount > 0 || $updateCount > 0) {
            $message = implode(', ', $messageParts);
            $messageType = 'success';
        } else {
            $message = "Hiçbir kayıt işlenemedi.";
            $messageType = 'error';
        }

        // Hataları ekle
        if (!empty($errors)) {
            $message .= '<br><br><strong>Hatalar:</strong><br>' . implode('<br>', array_slice($errors, 0, 10));
            if (count($errors) > 10) {
                $message .= '<br>... ve ' . (count($errors) - 10) . ' hata daha';
            }
        }

    } catch (Exception $e) {
        $message = 'Hata: ' . $e->getMessage();
        $messageType = 'error';
    }
}
?>

<div class="page-header">
    <div class="header-content">
        <h1 class="page-title">📚 Eğitim Tamamlama Verisi Yükleme</h1>
        <div class="header-actions">
            <a href="download_training_template.php" class="btn btn-success">📥 Excel Şablonu İndir</a>
            <a href="training_completion.php" class="btn btn-primary">📊 Verileri Görüntüle</a>
        </div>
    </div>
</div>

<?php if ($message): ?>
    <div class="alert alert-<?php echo $messageType; ?>">
        <?php echo $message; ?>
    </div>
<?php endif; ?>

<div class="upload-container">
    <div class="upload-card">
        <h2>📁 Excel Dosyası Yükle</h2>
        <form method="POST" enctype="multipart/form-data" class="upload-form" id="uploadForm">
            <div class="form-group">
                <label for="excel_file" class="form-label">Excel Dosyası Seçin</label>
                <input type="file"
                       name="excel_file"
                       id="excel_file"
                       accept=".xlsx,.xls,.csv"
                       class="form-control"
                       required>
                <small class="form-hint">Desteklenen formatlar: .xlsx, .xls, .csv</small>
            </div>

            <div class="form-actions">
                <button type="button" class="btn btn-primary btn-large" id="previewBtn" disabled onclick="showPreview()">
                    📊 Önizleme Göster
                </button>
            </div>
        </form>
    </div>

    <div class="info-card">
        <h3>ℹ️ Bilgilendirme</h3>
        <div class="info-content">
            <h4>Excel Formatı:</h4>
            <ul>
                <li><strong>A:</strong> Firma ID <span style="color: #e74c3c;">*Zorunlu</span></li>
                <li><strong>B:</strong> Firma Adı <span style="color: #e74c3c;">*Zorunlu</span></li>
                <li><strong>C:</strong> Satış Kaynağı</li>
                <li><strong>D:</strong> Destek Temsilcisi Adı ve Soyadı</li>
                <li><strong>E:</strong> Eğitim Tamamlanma Tarihi (birden fazla format desteklenir: DD/MM/YYYY, DD.MM.YYYY, DD-MM-YYYY, YYYY-MM-DD)</li>
                <li><strong>F:</strong> Satış Tipi <span style="color: #e74c3c;">*Zorunlu</span> (örn: Yeni Satış, Yenileme)</li>
                <li><strong>G:</strong> Paket Türü <span style="color: #e74c3c;">*Zorunlu</span> (örn: Profesyonel, Mikro ERP Muhasebe)</li>
            </ul>

            <h4 style="margin-top: 20px;">Önemli Notlar:</h4>
            <ul>
                <li>İlk satır başlık satırıdır, atlanır</li>
                <li>Aynı firma farklı paketler alabilir (örn: Profesyonel + Mikro ERP Muhasebe)</li>
                <li>Aynı Firma ID + Satış Tipi + Paket Türü kombinasyonu varsa kayıt güncellenir</li>
                <li>Farklı paket veya farklı satış tipi için yeni kayıt oluşturulur</li>
                <li>Tarih formatı: YYYY-MM-DD (örn: 2025-11-01)</li>
                <li>Boş satırlar otomatik atlanır</li>
            </ul>
        </div>
    </div>
</div>

<style>
.upload-container {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 30px;
    margin-top: 30px;
}

.upload-card, .info-card {
    background: #fff;
    border-radius: 12px;
    padding: 30px;
    box-shadow: 0 2px 8px rgba(0,0,0,0.1);
}

.upload-card h2, .info-card h3 {
    margin-top: 0;
    color: #2c3e50;
    font-size: 24px;
    margin-bottom: 20px;
}

.upload-form {
    margin-top: 20px;
}

.form-group {
    margin-bottom: 20px;
}

.form-label {
    display: block;
    margin-bottom: 8px;
    font-weight: 600;
    color: #34495e;
}

.form-control {
    width: 100%;
    padding: 12px;
    border: 2px solid #e0e0e0;
    border-radius: 8px;
    font-size: 14px;
    transition: border-color 0.3s;
}

.form-control:focus {
    outline: none;
    border-color: #3498db;
}

.form-hint {
    display: block;
    margin-top: 5px;
    font-size: 12px;
    color: #7f8c8d;
}

.form-actions {
    margin-top: 25px;
}

.btn-large {
    padding: 15px 30px;
    font-size: 16px;
    font-weight: 600;
}

.info-content h4 {
    color: #2c3e50;
    font-size: 16px;
    margin-bottom: 10px;
}

.info-content ul {
    margin: 10px 0;
    padding-left: 20px;
}

.info-content li {
    margin-bottom: 8px;
    line-height: 1.6;
    color: #555;
}

.info-content strong {
    color: #2c3e50;
}

@media (max-width: 968px) {
    .upload-container {
        grid-template-columns: 1fr;
    }
}

/* Preview Modal */
.preview-modal {
    display: none;
    position: fixed;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    background: rgba(0, 0, 0, 0.5);
    z-index: 1000;
    overflow-y: auto;
}

.preview-modal.show {
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 20px;
}

.preview-content {
    background: white;
    border-radius: 15px;
    padding: 30px;
    max-width: 95%;
    max-height: 90vh;
    overflow-y: auto;
    box-shadow: 0 10px 40px rgba(0, 0, 0, 0.3);
}

.preview-header {
    display: flex;
    justify-content: space-between;
    align-items: center;
    margin-bottom: 20px;
    padding-bottom: 15px;
    border-bottom: 2px solid #f0f0f0;
}

.preview-header h3 {
    font-size: 20px;
    font-weight: 600;
    color: #2c3e50;
    margin: 0;
}

.preview-info {
    background: #e8f4f8;
    padding: 12px 20px;
    border-radius: 8px;
    margin-bottom: 20px;
    color: #0c5460;
    font-size: 14px;
}

.preview-table {
    width: 100%;
    border-collapse: collapse;
    font-size: 13px;
    margin-bottom: 20px;
}

.preview-table th {
    background: #667eea;
    color: white;
    padding: 12px;
    text-align: left;
    font-weight: 600;
    position: sticky;
    top: 0;
}

.preview-table td {
    padding: 10px 12px;
    border-bottom: 1px solid #e0e0e0;
}

.preview-table tr:hover {
    background: #f8f9fa;
}

.preview-actions {
    display: flex;
    gap: 15px;
    justify-content: flex-end;
}

.btn-cancel-modal {
    background: #95a5a6;
    color: white;
    padding: 12px 30px;
    border: none;
    border-radius: 10px;
    font-size: 15px;
    font-weight: 600;
    cursor: pointer;
    transition: all 0.3s;
}

.btn-cancel-modal:hover {
    background: #7f8c8d;
}

.btn-confirm-modal {
    background: linear-gradient(135deg, #11998e 0%, #38ef7d 100%);
    color: white;
    padding: 12px 30px;
    border: none;
    border-radius: 10px;
    font-size: 15px;
    font-weight: 600;
    cursor: pointer;
    transition: all 0.3s;
}

.btn-confirm-modal:hover {
    transform: translateY(-2px);
    box-shadow: 0 5px 20px rgba(17, 153, 142, 0.4);
}

.loading {
    text-align: center;
    padding: 40px;
    font-size: 16px;
    color: #7f8c8d;
}
</style>

<!-- Preview Modal -->
<div class="preview-modal" id="previewModal">
    <div class="preview-content">
        <div class="preview-header">
            <h3>📊 Excel Önizleme</h3>
        </div>
        <div id="previewBody">
            <div class="loading">Yükleniyor...</div>
        </div>
    </div>
</div>

<script>
const fileInput = document.getElementById('excel_file');
const previewBtn = document.getElementById('previewBtn');
const previewModal = document.getElementById('previewModal');
let currentFile = null;

fileInput.addEventListener('change', function() {
    if (this.files.length > 0) {
        currentFile = this.files[0];
        previewBtn.disabled = false;
    } else {
        currentFile = null;
        previewBtn.disabled = true;
    }
});

function showPreview() {
    if (!currentFile) return;

    previewModal.classList.add('show');
    document.getElementById('previewBody').innerHTML = '<div class="loading">Yükleniyor...</div>';

    const formData = new FormData();
    formData.append('excel_file', currentFile);
    formData.append('action', 'preview');

    fetch('upload_training.php', {
        method: 'POST',
        body: formData
    })
    .then(response => response.json())
    .then(data => {
        if (data.success) {
            displayPreview(data);
        } else {
            document.getElementById('previewBody').innerHTML =
                '<div class="preview-info" style="background: #f8d7da; color: #721c24;">Hata: ' + data.error + '</div>';
        }
    })
    .catch(error => {
        document.getElementById('previewBody').innerHTML =
            '<div class="preview-info" style="background: #f8d7da; color: #721c24;">Bir hata oluştu: ' + error.message + '</div>';
    });
}

function displayPreview(data) {
    let html = '<div class="preview-info">';
    html += '<strong>📊 Toplam Satır:</strong> ' + data.totalRows + ' (İlk 10 satır gösteriliyor)';
    html += '</div>';

    html += '<div style="overflow-x: auto;">';
    html += '<table class="preview-table">';
    html += '<thead><tr>';

    // Başlıklar
    const columnNames = ['Firma ID', 'Firma Adı', 'Satış Kaynağı', 'Destek Temsilcisi', 'Eğitim Tarihi', 'Satış Tipi', 'Paket Türü'];
    columnNames.forEach((name, idx) => {
        const letter = String.fromCharCode(65 + idx);
        html += '<th>' + letter + ' - ' + name + '</th>';
    });
    html += '</tr></thead>';

    html += '<tbody>';
    data.rows.forEach((row, idx) => {
        html += '<tr>';
        row.forEach((cell, cellIdx) => {
            if (cellIdx < 7) { // Sadece ilk 7 sütunu göster
                html += '<td>' + (cell || '-') + '</td>';
            }
        });
        html += '</tr>';
    });
    html += '</tbody>';
    html += '</table>';
    html += '</div>';

    html += '<div class="preview-actions">';
    html += '<button type="button" class="btn-cancel-modal" onclick="closePreview()">İptal</button>';
    html += '<button type="button" class="btn-confirm-modal" onclick="confirmUpload()">Onayla ve Yükle</button>';
    html += '</div>';

    document.getElementById('previewBody').innerHTML = html;
}

function closePreview() {
    previewModal.classList.remove('show');
}

function confirmUpload() {
    // Gerçek formu gönder
    document.getElementById('uploadForm').submit();
}
</script>

<?php include 'includes/footer.php'; ?>
