<?php

// Configuración inicial
ini_set('display_errors', 0);
ini_set('log_errors', 1);
error_reporting(E_ALL);
ob_start();

// Establecer la ruta absoluta para error_log
ini_set('error_log', 'logs/nuevo-cliente.log');

// Manejo de errores personalizado
set_error_handler(function($errno, $errstr, $errfile, $errline) {
    error_log("Error [$errno] en $errfile:$errline - $errstr", 3, 'C:/xampp/htdocs/jk/logs/nuevo-cliente.log');
});

// Función de apagado para errores fatales
register_shutdown_function(function() {
    $error = error_get_last();
    if ($error && in_array($error['type'], [E_ERROR, E_PARSE, E_CORE_ERROR, E_COMPILE_ERROR])) {
        error_log("Fatal Error [{$error['type']}]: {$error['message']} en {$error['file']} línea {$error['line']}", 3, 'C:/xampp/htdocs/jk/logs/nuevo-cliente.log');
        if (!headers_sent()) {
            http_response_code(500);
            echo json_encode([
                'success' => false,
                'message' => 'Error del servidor. Inténtalo nuevamente más tarde.'
            ], JSON_UNESCAPED_UNICODE);
        }
    }
});

session_start();
// Verificar si el usuario está logueado y es admin
if (!isset($_SESSION['usuario_id']) || empty($_SESSION['usuario_id']) || $_SESSION['rol'] !== 'admin') {
    header('Location: ../login.php');
    exit;
}

require_once '../includes/config.php';
require_once '../includes/db.php';
//require_once '../includes/theme_only.php'; 

$db = new Database();

// Eliminar la restricción UNIQUE en la columna hobbies
try {
    // Verificar si existe el índice UNIQUE en hobbies
    $checkIndex = $db->query("SHOW INDEXES FROM clientes WHERE Column_name = 'hobbies' AND Non_unique = 0")->fetch();
    
    if ($checkIndex) {
        // Eliminar la restricción UNIQUE
        $db->query("ALTER TABLE clientes DROP INDEX hobbies");
        error_log("Restricción UNIQUE en hobbies eliminada correctamente", 3, 'C:/xampp/htdocs/jk/logs/nuevo-cliente.log');
    }
} catch (Exception $e) {
    error_log("Error al eliminar restricción UNIQUE en hobbies: " . $e->getMessage(), 3, 'C:/xampp/htdocs/jk/logs/nuevo-cliente.log');
}

// Script para modificar la tabla si no existen las columnas necesarias
try {
    // Verificar si existe la columna tipo_contribuyente
    $check = $db->query("SHOW COLUMNS FROM clientes LIKE 'tipo_contribuyente'")->fetch();
    
    if (!$check) {
        // Eliminar la restricción UNIQUE del email temporalmente
        $db->query("ALTER TABLE clientes DROP INDEX email");
        
        // Actualizar registros existentes con emails temporales únicos
        $db->query("UPDATE clientes SET 
                    apellidos = IFNULL(apellidos, ''),
                    razon_social = IFNULL(razon_social, ''),
                    email = IFNULL(email, CONCAT('no-email-', id_cliente, '@', 'temp.com'))
                    WHERE apellidos IS NULL OR razon_social IS NULL OR email IS NULL");
        
        // Actualizar ENUM para tipo_documento primero
        $db->query("ALTER TABLE clientes 
                    MODIFY COLUMN tipo_documento VARCHAR(20) NOT NULL");
        
        // Resto de alteraciones...
        $db->query("ALTER TABLE clientes 
                    ADD COLUMN tipo_contribuyente ENUM('Unipersonal', 'Persona Jurídica', 'No Contribuyente') DEFAULT NULL,
                    MODIFY COLUMN apellidos VARCHAR(100) NOT NULL DEFAULT '',
                    MODIFY COLUMN razon_social VARCHAR(150) NOT NULL DEFAULT '',
                    MODIFY COLUMN email VARCHAR(100) NOT NULL");
        
        // Volver a agregar la restricción UNIQUE para nuevos registros
        $db->query("ALTER TABLE clientes ADD UNIQUE INDEX (email)");
        
        error_log("Tabla clientes actualizada correctamente", 3, 'C:/xampp/htdocs/jk/logs/nuevo-cliente.log');
    }
} catch (Exception $e) {
    error_log("Error al actualizar tabla clientes: " . $e->getMessage(), 3, 'C:/xampp/htdocs/jk/logs/nuevo-cliente.log');
    $_SESSION['form_warning'] = "Advertencia: No se pudieron aplicar todas las actualizaciones de la base de datos. Algunas funciones pueden no estar disponibles.";
}

$formData = [];
if (isset($_SESSION['form_data']) && isset($_SESSION['form_error'])) {
    $formData = $_SESSION['form_data'];
    unset($_SESSION['form_data']);
    unset($_SESSION['form_error']);
}

// Obtener configuración del sitio
$config = $db->query("SELECT favicon, logo, color_principal, color_secundario FROM configuracion WHERE id = 1")->fetch();
$favicon = $config['favicon'] ? '../uploads/config/' . $config['favicon'] : '';
$logo = $config['logo'] ? '../uploads/config/' . $config['logo'] : '';
$colorPrincipal = $config['color_principal'] ?? '#28a745';
$colorSecundario = $config['color_secundario'] ?? '#6c757d';

// Procesar el formulario
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    try {
        // Validaciones básicas
        
        // En el procesamiento del POST
        $tipoDocumentoPermitidos = ['CI', 'RUC', 'DNI', 'NIE', 'Pasaporte', 'CIF'];
        if (empty($_POST['tipo_documento']) || !in_array($_POST['tipo_documento'], $tipoDocumentoPermitidos)) {
            throw new Exception("Tipo de documento no válido");
        }
        
        if (empty($_POST['numero_documento'])) {
            throw new Exception("El número de documento es requerido");
        }
        if (empty($_POST['nombre'])) {
            throw new Exception("El nombre es requerido");
        }
        if (empty($_POST['apellidos'])) {
            throw new Exception("Los apellidos son requeridos");
        }
        if (empty($_POST['razon_social'])) {
            throw new Exception("La razón social es requerida");
        }
        if (empty($_POST['direccion'])) {
            throw new Exception("La dirección es requerida");
        }
        if (empty($_POST['telefono_principal'])) {
            throw new Exception("El teléfono principal es requerido");
        }
        if (empty($_POST['email'])) {
            throw new Exception("El email es requerido");
        }
        if (!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) {
            throw new Exception("El email no tiene un formato válido");
        }
        if (empty($_POST['tipo_contribuyente'])) {
            throw new Exception("El tipo de contribuyente es requerido");
        }

        // Verificar si el documento ya existe
        $checkDocumento = $db->query(
            "SELECT id_cliente FROM clientes WHERE tipo_documento = ? AND numero_documento = ?",
            [$_POST['tipo_documento'], $_POST['numero_documento']]
        )->fetch();

        if ($checkDocumento) {
            throw new Exception("Ya existe un cliente con este documento");
        }

        // Validar email único
        $email = trim($_POST['email']);
        $checkEmail = $db->query(
            "SELECT id_cliente FROM clientes WHERE email = ? AND id_cliente != ?",
            [$email, isset($_POST['id_cliente']) ? $_POST['id_cliente'] : 0]
        )->fetch();

        if ($checkEmail) {
            throw new Exception("Ya existe un cliente con este email");
        }

        // Debug antes de la verificación final
        $tipo_documento_original = $_POST['tipo_documento'];
        error_log("VALOR ORIGINAL: '$tipo_documento_original'", 3, 'C:/xampp/htdocs/jk/logs/nuevo-cliente.log');

        // Limpiar y normalizar el valor
        $_POST['tipo_documento'] = preg_replace('/[^a-zA-Z]/', '', trim($_POST['tipo_documento']));

        // Debug después de la normalización
        error_log("VALOR NORMALIZADO: '{$_POST['tipo_documento']}'", 3, 'C:/xampp/htdocs/jk/logs/nuevo-cliente.log');

        // Limpia y verifica nuevamente el tipo_documento justo antes de insertarlo
        $tipoDocumentoPermitidos = ['CI', 'RUC', 'DNI', 'NIE', 'Pasaporte', 'CIF'];
        $tipo_documento = trim($_POST['tipo_documento']);

        // Forzar coincidencia exacta con uno de los valores permitidos
        $encontrado = false;
        foreach ($tipoDocumentoPermitidos as $valorPermitido) {
            if (strcasecmp($tipo_documento, $valorPermitido) === 0) {
                $tipo_documento = $valorPermitido; // Usar la versión exacta del array
                $encontrado = true;
                break;
            }
        }

        if (!$encontrado) {
            throw new Exception("El tipo de documento '$tipo_documento' no es válido. Valores permitidos: " . implode(", ", $tipoDocumentoPermitidos));
        }

        // Preparar datos - asegurarse que tipo_documento sea uno de los valores exactos del ENUM
        $datos = [
            'tipo_documento' => $tipo_documento, // Usar la variable limpia
            'numero_documento' => $_POST['numero_documento'],
            'nombre' => strtoupper(trim($_POST['nombre'])),
            'apellidos' => strtoupper(trim($_POST['apellidos'])), // Ahora es NOT NULL
            'razon_social' => strtoupper(trim($_POST['razon_social'])), // Ahora es NOT NULL
            'tipo_contribuyente' => $_POST['tipo_contribuyente'],
            'fecha_nacimiento' => !empty($_POST['fecha_nacimiento']) ? $_POST['fecha_nacimiento'] : null,
            'genero' => !empty($_POST['genero']) ? $_POST['genero'] : '',
            'direccion' => trim($_POST['direccion']),
            'codigo_postal' => trim($_POST['codigo_postal'] ?? ''),
            'ciudad' => trim($_POST['ciudad'] ?? ''),
            'departamento' => trim($_POST['departamento'] ?? ''),
            'pais' => trim($_POST['pais'] ?? 'Paraguay'),
            'telefono_principal' => trim($_POST['telefono_principal']),
            'telefono_secundario' => trim($_POST['telefono_secundario'] ?? ''),
            'email' => trim($_POST['email']), // Ahora es NOT NULL
            'hobbies' => !empty($_POST['hobbies']) ? trim($_POST['hobbies']) : null, // Asignar NULL si está vacío
            'limite_credito' => floatval(str_replace(',', '.', $_POST['limite_credito'] ?? 0)),
            'estado' => $_POST['estado'] ?? 'Activo',
            'notas' => trim($_POST['notas'] ?? ''),
            'preferencias_contacto' => $_POST['preferencias_contacto'] ?? 'Email',
            'categoria' => $_POST['categoria'] ?? 'Normal'
        ];

        // Crear consulta SQL
        $campos = implode(', ', array_keys($datos));
        $valores = implode(', ', array_fill(0, count($datos), '?'));
        $sql = "INSERT INTO clientes ($campos) VALUES ($valores)";

        $db->query($sql, array_values($datos));

        // Verificar inserción exitosa
        if ($db->getPDO()->lastInsertId()) {
            header('Location: exito.php?mensaje=' . urlencode('Cliente registrado exitosamente') . '&tipo=success&origen=registrar-cliente');
            exit;
        } else {
            throw new Exception("Error al registrar el cliente");
        }

    } catch (Exception $e) {
        $_SESSION['form_data'] = $_POST;
        $_SESSION['form_error'] = true;
        header('Location: exito.php?mensaje=' . urlencode($e->getMessage()) . '&tipo=error&origen=registrar-cliente');
        exit;
    }
}

// Diagnóstico para tipos de documento (agregar temporalmente antes del try/catch)
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['tipo_documento'])) {
    error_log("DIAGNÓSTICO - tipo_documento: '" . $_POST['tipo_documento'] . "'", 3, 'C:/xampp/htdocs/jk/logs/nuevo-cliente.log');
    error_log("DIAGNÓSTICO - longitud: " . strlen($_POST['tipo_documento']), 3, 'C:/xampp/htdocs/jk/logs/nuevo-cliente.log');
    error_log("DIAGNÓSTICO - valores hex: " . bin2hex($_POST['tipo_documento']), 3, 'C:/xampp/htdocs/jk/logs/nuevo-cliente.log');
}

//echo getThemeCSS();
require_once '../includes/header.php';

?>
<!DOCTYPE html>
<html lang="es">
<head>
<?php
    // Modo oscuro
    require_once '../includes/dark_mode.php';
    ?>
    <meta name="color-scheme" content="light dark">
    <?php echo getDarkModeStyles(); ?>

    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>JKEAS - Registrar Cliente</title>
    <?php if ($favicon): ?>
    <link rel="icon" type="image/x-icon" href="<?= htmlspecialchars($favicon) ?>">
    <?php endif; ?>
    <link rel="stylesheet" href="css/bootstrap.min.css">
    <link rel="stylesheet" href="../assets/css/styles.css">
    <style>
        /* Estilos específicos para el formulario de clientes */
        .form-section {
            background: white;
            padding: 20px;
            border-radius: 8px;
            box-shadow: 0 2px 4px rgba(0,0,0,0.1);
            margin-bottom: 20px;
        }

        .form-row {
            display: flex;
            gap: 20px;
            margin-bottom: 15px;
        }

        .form-group {
            flex: 1;
        }

        .form-control {
            width: 100%;
            padding: 8px;
            border: 1px solid #ddd;
            border-radius: 4px;
        }

        /* Estilos para los radio buttons */
        .radio-group {
            display: flex;
            gap: 15px;
            margin-top: 5px;
        }

        .radio-option {
            display: flex;
            align-items: center;
            gap: 5px;
        }

        /* Resto de estilos... (mantener los estilos existentes) */
    </style>
</head>
<body>
    <!-- Mantener el header existente... -->

    <div class="main-container">
        <div class="content-section">
            <form method="POST" id="formCliente">
                <!-- Información Personal -->
                <div class="form-section">
                    <h3>Información Personal</h3>
                    <div class="form-row">
                        <div class="form-group">
                            <label>Tipo de Documento*</label>
                            <select name="tipo_documento" class="form-control" required>
                                <option value="">Seleccione...</option>
                                <option value="CI">CI</option>
                                <option value="RUC">RUC</option>
                                <option value="DNI">DNI</option>
                                <option value="NIE">NIE</option>
                                <option value="Pasaporte">Pasaporte</option>
                                <option value="CIF">CIF</option>
                            </select>
                        </div>
                        <div class="form-group">
                            <label>Número de Documento*</label>
                            <input type="text" name="numero_documento" class="form-control" required>
                        </div>
                    </div>

                    <div class="form-row">
                        <div class="form-group">
                            <label>Nombre*</label>
                            <input type="text" name="nombre" class="form-control" required>
                        </div>
                        <div class="form-group">
                            <label>Apellidos*</label>
                            <input type="text" name="apellidos" class="form-control" required>
                        </div>
                    </div>

                    <div class="form-row">
                        <div class="form-group">
                            <label>Razón Social*</label>
                            <input type="text" name="razon_social" class="form-control" required>
                        </div>
                        <div class="form-group">
                            <label>Tipo de Contribuyente*</label>
                            <div class="radio-group">
                                <label class="radio-option">
                                    <input type="radio" name="tipo_contribuyente" value="Unipersonal" required> Unipersonal
                                </label>
                                <label class="radio-option">
                                    <input type="radio" name="tipo_contribuyente" value="Persona Jurídica"> Persona Jurídica
                                </label>
                                <label class="radio-option">
                                    <input type="radio" name="tipo_contribuyente" value="No Contribuyente"> No Contribuyente
                                </label>
                            </div>
                        </div>
                    </div>

                    <div class="form-row">
                        <div class="form-group">
                            <label>Fecha de Nacimiento</label>
                            <input type="date" name="fecha_nacimiento" class="form-control">
                        </div>
                        <div class="form-group">
                            <label>Género</label>
                            <select name="genero" class="form-control">
                                <option value="">Seleccione...</option>
                                <option value="M">Masculino</option>
                                <option value="F">Femenino</option>
                                <option value="Otro">Otro</option>
                            </select>
                        </div>
                    </div>
                </div>

                <!-- Resto del formulario (mantener las secciones existentes) -->

                <!-- Información de Contacto -->
                <div class="form-section">
                    <h3>Información de Contacto</h3>
                    <div class="form-row">
                        <div class="form-group">
                            <label>Dirección*</label>
                            <input type="text" name="direccion" class="form-control" required>
                        </div>
                        <div class="form-group">
                            <label>Código Postal</label>
                            <input type="text" name="codigo_postal" class="form-control">
                        </div>
                    </div>

                    <div class="form-row">
                        <div class="form-group">
                            <label>Ciudad</label>
                            <input type="text" name="ciudad" class="form-control">
                        </div>
                        <div class="form-group">
                            <label>Departamento</label>
                            <input type="text" name="departamento" class="form-control">
                        </div>
                        <div class="form-group">
                            <label>País</label>
                            <input type="text" name="pais" class="form-control" value="Paraguay">
                        </div>
                    </div>

                    <div class="form-row">
                        <div class="form-group">
                            <label>Teléfono Principal*</label>
                            <input type="tel" name="telefono_principal" class="form-control" required>
                        </div>
                        <div class="form-group">
                            <label>Teléfono Secundario</label>
                            <input type="tel" name="telefono_secundario" class="form-control">
                        </div>
                        <div class="form-group">
                            <label>Email*</label>
                            <input type="email" name="email" class="form-control" required>
                        </div>
                    </div>
                </div>

                <!-- Resto del formulario (mantener las secciones existentes) -->

                <button type="submit" class="btn" style="background-color: <?= $colorPrincipal ?>">
                    <span class="icon">
                        <?php include('icons/save.svg'); ?>
                    </span>
                    Guardar Cliente
                </button>
            </form>
        </div>
    </div>

    <script>
        document.getElementById('formCliente').addEventListener('submit', function(e) {
            // Validaciones básicas del formulario
            const requiredFields = [
                'tipo_documento', 'numero_documento', 'nombre', 'apellidos', 
                'razon_social', 'direccion', 'telefono_principal', 'email',
                'tipo_contribuyente'
            ];
            let isValid = true;

            requiredFields.forEach(field => {
                const input = this.elements[field];
                if (input.type === 'radio') {
                    const radioChecked = document.querySelector(`input[name="${field}"]:checked`);
                    if (!radioChecked) {
                        isValid = false;
                        document.querySelectorAll(`input[name="${field}"]`).forEach(radio => {
                            radio.parentElement.classList.add('error');
                        });
                    } else {
                        document.querySelectorAll(`input[name="${field}"]`).forEach(radio => {
                            radio.parentElement.classList.remove('error');
                        });
                    }
                } else if (!input.value.trim()) {
                    isValid = false;
                    input.classList.add('error');
                } else {
                    input.classList.remove('error');
                }
            });

            // Validar email
            const email = this.elements['email'].value.trim();
            if (email && !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)) {
                isValid = false;
                this.elements['email'].classList.add('error');
            }

            if (!isValid) {
                e.preventDefault();
                alert('Por favor, complete todos los campos obligatorios y verifique el formato del email');
            }
        });

        function calcularDigitoVerificador(ruc) {
            if (!ruc) return '';
            
            // Limpiar el RUC de cualquier carácter que no sea número
            ruc = ruc.replace(/\D/g, '');
            
            if (ruc.length < 6) return '';

            // Algoritmo para calcular el dígito verificador
            const baseMax = 11;
            let k = 2;
            let total = 0;

            // Iteramos de derecha a izquierda
            for (let i = ruc.length - 1; i >= 0; i--) {
                k = k > baseMax ? 2 : k;
                total += parseInt(ruc.charAt(i)) * k++;
            }

            let resto = total % 11;
            let digito = resto > 1 ? 11 - resto : 0;

            return digito;
        }

        document.addEventListener('DOMContentLoaded', function() {
            // Invertir el orden de los campos en el formulario
            const tipoDocumentoDiv = document.querySelector('select[name="tipo_documento"]').closest('.form-group');
            const numeroDocumentoDiv = document.querySelector('input[name="numero_documento"]').closest('.form-group');
            const parentDiv = tipoDocumentoDiv.parentNode;
            
            parentDiv.insertBefore(numeroDocumentoDiv, tipoDocumentoDiv);

            // Agregar la funcionalidad del dígito verificador
            const tipoDocumento = document.querySelector('select[name="tipo_documento"]');
            const numeroDocumento = document.querySelector('input[name="numero_documento"]');
            
            function actualizarDocumento() {
                if (tipoDocumento.value === 'RUC') {
                    let numero = numeroDocumento.value.split('-')[0]; // Obtener solo el número sin DV
                    if (numero) {
                        const dv = calcularDigitoVerificador(numero);
                        numeroDocumento.value = `${numero}-${dv}`;
                    }
                }
            }

            // Actualizar cuando cambia el tipo de documento
            tipoDocumento.addEventListener('change', function() {
                if (this.value === 'RUC') {
                    actualizarDocumento();
                }
            });

            // Actualizar cuando se modifica el número de documento
            numeroDocumento.addEventListener('input', function() {
                if (tipoDocumento.value === 'RUC') {
                    clearTimeout(this.timeout);
                    this.timeout = setTimeout(() => {
                        actualizarDocumento();
                    }, 500);
                }
            });

            // Ejecutar al cargar la página si ya es RUC
            if (tipoDocumento.value === 'RUC') {
                actualizarDocumento();
            }
        });
    </script>
</body>
</html>