<?php
session_start();

// Verificar si ya existe instalación
if (file_exists('api/config/config.php')) {
    die('El sistema ya está instalado. Si necesita reinstalar, elimine el archivo api/config/config.php');
}

// Inicializar variables de sesión si no existen
if (!isset($_SESSION['install_step'])) {
    $_SESSION['install_step'] = 1;
}

$step = $_SESSION['install_step'];
$errors = [];
$success = [];

// Procesar formularios
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    switch ($step) {
        case 1:
            $result = processDatabaseConfig();
            if ($result['success']) {
                $_SESSION['install_step'] = 2;
                $_SESSION['db_config'] = $result['data'];
                $step = 2;
                $success[] = 'Conexión a base de datos exitosa';
            } else {
                $errors = $result['errors'];
            }
            break;
            
        case 2:
            $result = createDatabaseTables();
            if ($result['success']) {
                $_SESSION['install_step'] = 3;
                $step = 3;
                $success[] = 'Tablas de base de datos creadas exitosamente';
            } else {
                $errors = $result['errors'];
            }
            break;
            
        case 3:
            $result = createAdminUser();
            if ($result['success']) {
                $_SESSION['install_step'] = 4;
                $step = 4;
                $success[] = 'Usuario administrador creado exitosamente';
            } else {
                $errors = $result['errors'];
            }
            break;
            
        case 4:
            $result = createConfigFile();
            if ($result['success']) {
                $_SESSION['install_step'] = 5;
                $step = 5;
                $success[] = 'Archivo de configuración creado exitosamente';
            } else {
                $errors = $result['errors'];
            }
            break;
    }
}

function processDatabaseConfig() {
    $host = trim($_POST['db_host'] ?? '');
    $name = trim($_POST['db_name'] ?? '');
    $user = trim($_POST['db_user'] ?? '');
    $pass = $_POST['db_pass'] ?? '';
    
    $errors = [];
    
    // Validaciones
    if (empty($host)) $errors[] = 'El host de la base de datos es requerido';
    if (empty($name)) $errors[] = 'El nombre de la base de datos es requerido';
    if (empty($user)) $errors[] = 'El usuario de la base de datos es requerido';
    
    if (!empty($errors)) {
        return ['success' => false, 'errors' => $errors];
    }
    
    // Probar conexión
    try {
        $dsn = "mysql:host=$host;charset=utf8mb4";
        $pdo = new PDO($dsn, $user, $pass, [
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
            PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
        ]);
        
        // Verificar si la base de datos existe, si no, crearla
        $stmt = $pdo->prepare("CREATE DATABASE IF NOT EXISTS `$name` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci");
        $stmt->execute();
        
        // Conectar a la base de datos específica
        $dsn = "mysql:host=$host;dbname=$name;charset=utf8mb4";
        $pdo = new PDO($dsn, $user, $pass, [
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
            PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
        ]);
        
        return [
            'success' => true,
            'data' => [
                'host' => $host,
                'name' => $name,
                'user' => $user,
                'pass' => $pass,
                'pdo' => $pdo
            ]
        ];
        
    } catch (PDOException $e) {
        return ['success' => false, 'errors' => ['Error de conexión: ' . $e->getMessage()]];
    }
}

function createDatabaseTables() {
    if (!isset($_SESSION['db_config'])) {
        return ['success' => false, 'errors' => ['Configuración de base de datos no encontrada']];
    }
    
    $config = $_SESSION['db_config'];
    
    try {
        $dsn = "mysql:host={$config['host']};dbname={$config['name']};charset=utf8mb4";
        $pdo = new PDO($dsn, $config['user'], $config['pass'], [
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
        ]);
        
        // SQL para crear todas las tablas
        $sql = "
        CREATE TABLE IF NOT EXISTS usuarios (
            id INT PRIMARY KEY AUTO_INCREMENT,
            nombre VARCHAR(100) NOT NULL,
            email VARCHAR(100) UNIQUE NOT NULL,
            password_hash VARCHAR(255) NOT NULL,
            rol ENUM('Administrador', 'Regente', 'Técnico de Campo') NOT NULL,
            fecha_creacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
            activo BOOLEAN DEFAULT TRUE,
            ultimo_acceso TIMESTAMP NULL
        );
        
        CREATE TABLE IF NOT EXISTS proyectos (
            id INT PRIMARY KEY AUTO_INCREMENT,
            fecha_creacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
            nombre_proyecto VARCHAR(200) NOT NULL,
            nombre_finca VARCHAR(200) NOT NULL,
            departamento VARCHAR(100) NOT NULL,
            municipio VARCHAR(100) NOT NULL,
            aldea VARCHAR(100) NOT NULL,
            nombre_propietario VARCHAR(200) NOT NULL,
            nombre_regente_forestal VARCHAR(200) NOT NULL,
            doc_tenencia_path VARCHAR(500) NULL,
            doc_regencia_path VARCHAR(500) NULL,
            usuario_id INT NOT NULL,
            FOREIGN KEY (usuario_id) REFERENCES usuarios(id)
        );
        
        CREATE TABLE IF NOT EXISTS rodales (
            id INT PRIMARY KEY AUTO_INCREMENT,
            proyecto_id INT NOT NULL,
            nombre_rodal VARCHAR(100) NOT NULL,
            area_ha DECIMAL(10,4) NOT NULL,
            fecha_creacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
            FOREIGN KEY (proyecto_id) REFERENCES proyectos(id) ON DELETE CASCADE
        );
        
        CREATE TABLE IF NOT EXISTS especies (
            id INT PRIMARY KEY AUTO_INCREMENT,
            nombre_cientifico VARCHAR(200) NOT NULL,
            nombre_comun VARCHAR(200) NOT NULL,
            activa BOOLEAN DEFAULT TRUE
        );
        
        CREATE TABLE IF NOT EXISTS datos_campo (
            id INT PRIMARY KEY AUTO_INCREMENT,
            rodal_id INT NOT NULL,
            numero_parcela INT NOT NULL,
            fecha_captura TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
            latitud DECIMAL(10, 8) NOT NULL,
            longitud DECIMAL(11, 8) NOT NULL,
            especie_id INT NOT NULL,
            dap_cm DECIMAL(6,2) NOT NULL,
            altura_m DECIMAL(6,2) NOT NULL,
            condicion_arbol ENUM('Sano', 'Bifurcado', 'Plagado', 'Muerto en Pie') NOT NULL,
            estado_sincronizacion ENUM('Pendiente', 'Sincronizado') DEFAULT 'Pendiente',
            usuario_id INT NOT NULL,
            FOREIGN KEY (rodal_id) REFERENCES rodales(id) ON DELETE CASCADE,
            FOREIGN KEY (especie_id) REFERENCES especies(id),
            FOREIGN KEY (usuario_id) REFERENCES usuarios(id)
        );
        
        CREATE TABLE IF NOT EXISTS configuracion (
            clave VARCHAR(100) PRIMARY KEY,
            valor TEXT NOT NULL,
            descripcion TEXT NULL,
            fecha_modificacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
        );
        ";
        
        // Ejecutar el SQL
        $pdo->exec($sql);
        
        // Insertar especies predefinidas
        $especies = [
            ['Pinus maximinoi', 'Pino Candelillo'],
            ['Cupressus lusitanica', 'Ciprés'],
            ['Pinus oocarpa', 'Pino Ocote'],
            ['Quercus sp.', 'Encino'],
            ['Alnus acuminata', 'Aliso'],
            ['Liquidambar styraciflua', 'Liquidámbar'],
            ['Cedrela odorata', 'Cedro'],
            ['Swietenia macrophylla', 'Caoba'],
            ['Cordia alliodora', 'Laurel'],
            ['Terminalia amazonia', 'Volador']
        ];
        
        $stmt = $pdo->prepare("INSERT IGNORE INTO especies (nombre_cientifico, nombre_comun) VALUES (?, ?)");
        foreach ($especies as $especie) {
            $stmt->execute($especie);
        }
        
        return ['success' => true];
        
    } catch (PDOException $e) {
        return ['success' => false, 'errors' => ['Error creando tablas: ' . $e->getMessage()]];
    }
}

function createAdminUser() {
    $nombre = trim($_POST['admin_nombre'] ?? '');
    $email = trim($_POST['admin_email'] ?? '');
    $password = $_POST['admin_password'] ?? '';
    $confirm_password = $_POST['admin_confirm_password'] ?? '';
    
    $errors = [];
    
    // Validaciones
    if (empty($nombre)) $errors[] = 'El nombre del administrador es requerido';
    if (empty($email)) $errors[] = 'El email del administrador es requerido';
    if (!filter_var($email, FILTER_VALIDATE_EMAIL)) $errors[] = 'El email no es válido';
    if (empty($password)) $errors[] = 'La contraseña es requerida';
    if (strlen($password) < 6) $errors[] = 'La contraseña debe tener al menos 6 caracteres';
    if ($password !== $confirm_password) $errors[] = 'Las contraseñas no coinciden';
    
    if (!empty($errors)) {
        return ['success' => false, 'errors' => $errors];
    }
    
    if (!isset($_SESSION['db_config'])) {
        return ['success' => false, 'errors' => ['Configuración de base de datos no encontrada']];
    }
    
    $config = $_SESSION['db_config'];
    
    try {
        $dsn = "mysql:host={$config['host']};dbname={$config['name']};charset=utf8mb4";
        $pdo = new PDO($dsn, $config['user'], $config['pass'], [
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
        ]);
        
        // Verificar si ya existe un usuario con ese email
        $stmt = $pdo->prepare("SELECT id FROM usuarios WHERE email = ?");
        $stmt->execute([$email]);
        if ($stmt->fetch()) {
            return ['success' => false, 'errors' => ['Ya existe un usuario con ese email']];
        }
        
        // Crear el usuario administrador
        $password_hash = password_hash($password, PASSWORD_DEFAULT);
        $stmt = $pdo->prepare("INSERT INTO usuarios (nombre, email, password_hash, rol) VALUES (?, ?, ?, 'Administrador')");
        $stmt->execute([$nombre, $email, $password_hash]);
        
        $_SESSION['admin_user'] = [
            'nombre' => $nombre,
            'email' => $email
        ];
        
        return ['success' => true];
        
    } catch (PDOException $e) {
        return ['success' => false, 'errors' => ['Error creando usuario: ' . $e->getMessage()]];
    }
}

function createConfigFile() {
    if (!isset($_SESSION['db_config'])) {
        return ['success' => false, 'errors' => ['Configuración de base de datos no encontrada']];
    }
    
    $config = $_SESSION['db_config'];
    
    // Crear directorio config si no existe
    if (!is_dir('api/config')) {
        if (!mkdir('api/config', 0755, true)) {
            return ['success' => false, 'errors' => ['No se pudo crear el directorio api/config']];
        }
    }
    
    // Generar JWT secret
    $jwt_secret = bin2hex(random_bytes(32));
    
    $config_content = "<?php
// Configuración de Base de Datos
define('DB_HOST', '{$config['host']}');
define('DB_NAME', '{$config['name']}');
define('DB_USER', '{$config['user']}');
define('DB_PASS', '{$config['pass']}');

// Configuración JWT
define('JWT_SECRET', '$jwt_secret');
define('JWT_EXPIRE_TIME', 24 * 60 * 60); // 24 horas

// Configuración de archivos
define('UPLOAD_PATH', __DIR__ . '/../../uploads/');
define('MAX_FILE_SIZE', 5 * 1024 * 1024); // 5MB

// Configuración de CORS
define('ALLOWED_ORIGIN', '*'); // Cambiar en producción

// Configuración de la aplicación
define('APP_NAME', 'Sistema de Inventario Forestal Guatemala');
define('APP_VERSION', '1.0');

// Zona horaria
date_default_timezone_set('America/Guatemala');
?>";
    
    if (file_put_contents('api/config/config.php', $config_content) === false) {
        return ['success' => false, 'errors' => ['No se pudo crear el archivo de configuración']];
    }
    
    // Crear directorio uploads si no existe
    if (!is_dir('uploads/documents')) {
        mkdir('uploads/documents', 0755, true);
    }
    
    return ['success' => true];
}

?>
<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Instalación - Sistema de Inventario Forestal Guatemala</title>
    <style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }
        
        body {
            font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
            background: linear-gradient(135deg, #2d5a27 0%, #4a7c59 100%);
            min-height: 100vh;
            display: flex;
            align-items: center;
            justify-content: center;
            padding: 20px;
        }
        
        .container {
            background: white;
            border-radius: 12px;
            box-shadow: 0 20px 40px rgba(0,0,0,0.1);
            max-width: 600px;
            width: 100%;
            overflow: hidden;
        }
        
        .header {
            background: #2d5a27;
            color: white;
            padding: 30px;
            text-align: center;
        }
        
        .header h1 {
            font-size: 24px;
            margin-bottom: 10px;
        }
        
        .header p {
            opacity: 0.9;
            font-size: 16px;
        }
        
        .progress {
            background: #f8f9fa;
            padding: 20px 30px;
            border-bottom: 1px solid #e9ecef;
        }
        
        .progress-bar {
            background: #e9ecef;
            height: 8px;
            border-radius: 4px;
            overflow: hidden;
            margin-bottom: 15px;
        }
        
        .progress-fill {
            background: #28a745;
            height: 100%;
            transition: width 0.3s ease;
        }
        
        .step-info {
            font-size: 14px;
            color: #6c757d;
        }
        
        .content {
            padding: 30px;
        }
        
        .form-group {
            margin-bottom: 20px;
        }
        
        .form-group label {
            display: block;
            margin-bottom: 8px;
            font-weight: 600;
            color: #333;
        }
        
        .form-group input {
            width: 100%;
            padding: 12px;
            border: 2px solid #e9ecef;
            border-radius: 6px;
            font-size: 16px;
            transition: border-color 0.3s ease;
        }
        
        .form-group input:focus {
            outline: none;
            border-color: #2d5a27;
        }
        
        .btn {
            background: #2d5a27;
            color: white;
            padding: 12px 30px;
            border: none;
            border-radius: 6px;
            font-size: 16px;
            font-weight: 600;
            cursor: pointer;
            transition: background-color 0.3s ease;
            width: 100%;
        }
        
        .btn:hover {
            background: #1e3a1a;
        }
        
        .alert {
            padding: 15px;
            border-radius: 6px;
            margin-bottom: 20px;
        }
        
        .alert-error {
            background: #f8d7da;
            color: #721c24;
            border: 1px solid #f5c6cb;
        }
        
        .alert-success {
            background: #d4edda;
            color: #155724;
            border: 1px solid #c3e6cb;
        }
        
        .step-title {
            font-size: 20px;
            font-weight: 600;
            margin-bottom: 15px;
            color: #2d5a27;
        }
        
        .step-description {
            color: #6c757d;
            margin-bottom: 25px;
            line-height: 1.5;
        }
        
        .success-icon {
            text-align: center;
            font-size: 48px;
            color: #28a745;
            margin-bottom: 20px;
        }
        
        .final-message {
            text-align: center;
            padding: 20px;
        }
        
        .final-message h2 {
            color: #2d5a27;
            margin-bottom: 15px;
        }
        
        .final-message p {
            color: #6c757d;
            margin-bottom: 20px;
        }
        
        .btn-secondary {
            background: #6c757d;
            color: white;
            text-decoration: none;
            display: inline-block;
            padding: 12px 30px;
            border-radius: 6px;
            font-weight: 600;
        }
        
        .btn-secondary:hover {
            background: #545b62;
        }
    </style>
</head>
<body>
    <div class="container">
        <div class="header">
            <h1>Sistema de Inventario Forestal</h1>
            <p>Instalación y Configuración Inicial</p>
        </div>
        
        <div class="progress">
            <div class="progress-bar">
                <div class="progress-fill" style="width: <?= ($step / 5) * 100 ?>%"></div>
            </div>
            <div class="step-info">Paso <?= $step ?> de 5</div>
        </div>
        
        <div class="content">
            <?php if (!empty($errors)): ?>
                <div class="alert alert-error">
                    <?php foreach ($errors as $error): ?>
                        <div><?= htmlspecialchars($error) ?></div>
                    <?php endforeach; ?>
                </div>
            <?php endif; ?>
            
            <?php if (!empty($success)): ?>
                <div class="alert alert-success">
                    <?php foreach ($success as $msg): ?>
                        <div><?= htmlspecialchars($msg) ?></div>
                    <?php endforeach; ?>
                </div>
            <?php endif; ?>
            
            <?php if ($step == 1): ?>
                <div class="step-title">Configuración de Base de Datos</div>
                <div class="step-description">
                    Ingrese los datos de conexión a su base de datos MySQL. El sistema creará automáticamente la base de datos si no existe.
                </div>
                
                <form method="POST">
                    <div class="form-group">
                        <label for="db_host">Host de Base de Datos</label>
                        <input type="text" id="db_host" name="db_host" value="<?= htmlspecialchars($_POST['db_host'] ?? 'localhost') ?>" required>
                    </div>
                    
                    <div class="form-group">
                        <label for="db_name">Nombre de Base de Datos</label>
                        <input type="text" id="db_name" name="db_name" value="<?= htmlspecialchars($_POST['db_name'] ?? 'sif_guatemala') ?>" required>
                    </div>
                    
                    <div class="form-group">
                        <label for="db_user">Usuario de Base de Datos</label>
                        <input type="text" id="db_user" name="db_user" value="<?= htmlspecialchars($_POST['db_user'] ?? '') ?>" required>
                    </div>
                    
                    <div class="form-group">
                        <label for="db_pass">Contraseña de Base de Datos</label>
                        <input type="password" id="db_pass" name="db_pass" value="<?= htmlspecialchars($_POST['db_pass'] ?? '') ?>">
                    </div>
                    
                    <button type="submit" class="btn">Probar Conexión</button>
                </form>
                
            <?php elseif ($step == 2): ?>
                <div class="step-title">Crear Tablas de Base de Datos</div>
                <div class="step-description">
                    El sistema creará automáticamente todas las tablas necesarias y datos iniciales.
                </div>
                
                <form method="POST">
                    <button type="submit" class="btn">Crear Tablas</button>
                </form>
                
            <?php elseif ($step == 3): ?>
                <div class="step-title">Crear Usuario Administrador</div>
                <div class="step-description">
                    Cree el primer usuario administrador que tendrá acceso completo al sistema.
                </div>
                
                <form method="POST">
                    <div class="form-group">
                        <label for="admin_nombre">Nombre Completo</label>
                        <input type="text" id="admin_nombre" name="admin_nombre" value="<?= htmlspecialchars($_POST['admin_nombre'] ?? '') ?>" required>
                    </div>
                    
                    <div class="form-group">
                        <label for="admin_email">Email</label>
                        <input type="email" id="admin_email" name="admin_email" value="<?= htmlspecialchars($_POST['admin_email'] ?? '') ?>" required>
                    </div>
                    
                    <div class="form-group">
                        <label for="admin_password">Contraseña</label>
                        <input type="password" id="admin_password" name="admin_password" required>
                    </div>
                    
                    <div class="form-group">
                        <label for="admin_confirm_password">Confirmar Contraseña</label>
                        <input type="password" id="admin_confirm_password" name="admin_confirm_password" required>
                    </div>
                    
                    <button type="submit" class="btn">Crear Administrador</button>
                </form>
                
            <?php elseif ($step == 4): ?>
                <div class="step-title">Generar Configuración</div>
                <div class="step-description">
                    El sistema generará los archivos de configuración necesarios para el funcionamiento.
                </div>
                
                <form method="POST">
                    <button type="submit" class="btn">Generar Configuración</button>
                </form>
                
            <?php elseif ($step == 5): ?>
                <div class="success-icon">✅</div>
                <div class="final-message">
                    <h2>¡Instalación Completada!</h2>
                    <p>El Sistema de Inventario Forestal de Guatemala ha sido instalado exitosamente.</p>
                    
                    <?php if (isset($_SESSION['admin_user'])): ?>
                        <div class="alert alert-success">
                            <strong>Usuario Administrador:</strong><br>
                            Email: <?= htmlspecialchars($_SESSION['admin_user']['email']) ?><br>
                            Nombre: <?= htmlspecialchars($_SESSION['admin_user']['nombre']) ?>
                        </div>
                    <?php endif; ?>
                    
                    <p>Puede acceder al sistema usando las credenciales del administrador que acaba de crear.</p>
                    
                    <a href="/" class="btn-secondary">Ir al Sistema</a>
                </div>
                
                <?php
                // Limpiar sesión de instalación
                session_destroy();
                ?>
            <?php endif; ?>
        </div>
    </div>
</body>
</html>
