<?php
// importar via composer
require 'vendor/autoload.php';

use PhpOffice\PhpSpreadsheet\IOFactory;

// === CONFIG DB ===
// Ajusta estos valores según tu entorno
$dbHost = 'localhost';
$dbName = 'ugel';
$dbUser = 'root';
$dbPass = '1234';
$charset = 'utf8mb4';

// Ruta del archivo Excel (ajusta si es necesario)
$inputFilePath = __DIR__ . '/excel/data.xlsx';

// Rango de filas a procesar
$startRow = 3;
$endRow = 232;

function toUpper($s) {
    return $s === null ? null : mb_strtoupper(trim($s), 'UTF-8');
}

function safeTrim($s) {
    return $s === null ? null : trim($s);
}

try {
    // Conexión PDO
    $dsn = "mysql:host={$dbHost};dbname={$dbName};charset={$charset}";
    $pdo = new PDO($dsn, $dbUser, $dbPass, [
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_EMULATE_PREPARES => false,
    ]);

    echo "Conectado a DB correctamente.\n";

    // Preparar sentencias
    $insertUserStmt = $pdo->prepare("
        INSERT INTO users (username, password, role, active, deleted_at, profile_picture)
        VALUES (:username, :password, :role, :active, :deleted_at, :profile_picture)
    ");

    $checkUsernameStmt = $pdo->prepare("SELECT COUNT(*) as c FROM users WHERE username = :username");

    $insertComunityUserStmt = $pdo->prepare("
        INSERT INTO comunity_users
            (name, paternal_surname, maternal_surname, dni, company_name, ruc, phone, email, address, user_id, active, deleted_at)
        VALUES
            (:name, :paternal_surname, :maternal_surname, :dni, :company_name, :ruc, :phone, :email, :address, :user_id, :active, :deleted_at)
    ");

    $insertUserPersonTypeStmt = $pdo->prepare("
        INSERT INTO users_person_types (comunity_user_id, person_type_id, active, deleted_at)
        VALUES (:comunity_user_id, :person_type_id, :active, :deleted_at)
    ");

    $insertDirectorDataStmt = $pdo->prepare("
        INSERT INTO user_director_data (comunity_user_id, school_name, active, created_at, updated_at, deleted_at)
        VALUES (:comunity_user_id, :school_name, :active, :created_at, :updated_at, :deleted_at)
    ");

    // Cargar el spreadsheet
    $spreadsheet = IOFactory::load($inputFilePath);
    $sheet = $spreadsheet->getActiveSheet();

    echo "Archivo Excel cargado: {$inputFilePath}\n";

    // Map columnas -> índices (A=1)
    // A: Nombres
    // B: Apellido Paterno
    // C: Apellido Materno
    // D: DNI
    // E: Teléfono
    // F: Correo Electrónico
    // G: Dirección
    // H: Nombre o Número de I.E
    // I: Cargo

    $rowsProcessed = 0;
    $rowsSkipped = 0;

    for ($r = $startRow; $r <= $endRow; $r++) {
        // Leer toda la fila de la A a la I
        $row = $sheet->rangeToArray("A{$r}:I{$r}", null, true, false);

        // Como rangeToArray devuelve un array bidimensional, tomamos el primer elemento
        $rowData = $row[0];

        $nombre     = safeTrim((string)$rowData[0]); // Columna A
        $apellidoP  = safeTrim((string)$rowData[1]); // Columna B
        $apellidoM  = safeTrim((string)$rowData[2]); // Columna C
        $dni        = safeTrim((string)$rowData[3]); // Columna D
        $telefono   = safeTrim((string)$rowData[4]); // Columna E
        $email      = safeTrim((string)$rowData[5]); // Columna F
        $direccion  = safeTrim((string)$rowData[6]); // Columna G
        $ie_nombre  = safeTrim((string)$rowData[7]); // Columna H
        $cargo      = safeTrim((string)$rowData[8]); // Columna I

        // Si fila vacía (todos campos vacíos) -> saltar
        if ($nombre === '' && $apellidoP === '' && $apellidoM === '' && $dni === '' && $email === '' && $cargo === '') {
            $rowsSkipped++;
            continue;
        }

        // Validación mínima: DNI y Apellido Paterno y Nombre necesarios para generar username/password
        if ($dni === '' || $apellidoP === '' || $nombre === '') {
            echo "[Fila {$r}] SALTADA: falta DNI o Apellido Paterno o Nombres. (DNI={$dni}, ApellidoP={$apellidoP}, Nombre={$nombre})\n";
            $rowsSkipped++;
            continue;
        }

        // Empieza transacción por fila
        $pdo->beginTransaction();
        try {
            // --- Crear username ---
            // username = primera letra del primer nombre + apellido paterno, todo en mayúsculas
            // Obtener primer nombre (puede haber varios nombres separados por espacios)
            $primerNombre = explode(' ', $nombre)[0];
            $usernameBase = mb_strtoupper(substr($primerNombre, 0, 1) . $apellidoP, 'UTF-8');
            $username = $usernameBase;

            // Si existe, agregar sufijo numérico incremental
            $suffix = 0;
            while (true) {
                $checkUsernameStmt->execute([':username' => $username]);
                $row = $checkUsernameStmt->fetch(PDO::FETCH_ASSOC);
                if ($row && intval($row['c']) > 0) {
                    $suffix++;
                    $username = $usernameBase . $suffix; // ej PMARTINEZ1
                } else {
                    break;
                }
            }

            // --- Password hashed (DNI) ---
            $passwordHash = password_hash($dni, PASSWORD_BCRYPT);

            // Insertar en users
            $insertUserStmt->execute([
                ':username' => $username,
                ':password' => $passwordHash,
                ':role' => 'COMUNITY',
                ':active' => 1,
                ':deleted_at' => null,
                ':profile_picture' => null
            ]);

            $userId = $pdo->lastInsertId();

            // --- Insertar en comunity_users ---
            $insertComunityUserStmt->execute([
                ':name' => toUpper($nombre),
                ':paternal_surname' => toUpper($apellidoP),
                ':maternal_surname' => toUpper($apellidoM),
                ':dni' => $dni,
                ':company_name' => null,
                ':ruc' => null,
                ':phone' => $telefono === '' ? null : toUpper($telefono),
                ':email' => $email === '' ? null : strtolower($email), // email en minúsculas
                ':address' => $direccion === '' ? null : toUpper($direccion),
                ':user_id' => $userId,
                ':active' => 1,
                ':deleted_at' => null
            ]);

            $comunityUserId = $pdo->lastInsertId();

            // --- Determinar person types por la columna Cargo ---
            // reglas: si cargo contiene 'docente' => person_type_id = 4
            // si cargo contiene 'director' => person_type_id = 5
            // si ninguno => person_type_id = 1 (NATURAL)
            // puede ser ambos (p.e. 'Director - Docente' -> crear ambos registros)
            $cargoLower = mb_strtolower($cargo, 'UTF-8');
            $isDocente = (strpos($cargoLower, 'docente') !== false);
            $isDirector = (strpos($cargoLower, 'director') !== false);

            $personTypesToInsert = [];

            if ($isDocente) $personTypesToInsert[] = 4;
            if ($isDirector) $personTypesToInsert[] = 5;
            if (!$isDocente && !$isDirector) $personTypesToInsert[] = 1;

            foreach ($personTypesToInsert as $ptype) {
                $insertUserPersonTypeStmt->execute([
                    ':comunity_user_id' => $comunityUserId,
                    ':person_type_id' => $ptype,
                    ':active' => 1,
                    ':deleted_at' => null
                ]);
            }

            // --- Si es director (person_type_id 5), insertar en user_director_data ---
            if (in_array(5, $personTypesToInsert)) {
                $now = date('Y-m-d H:i:s');
                $insertDirectorDataStmt->execute([
                    ':comunity_user_id' => $comunityUserId,
                    ':school_name' => toUpper($ie_nombre),
                    ':active' => 1,
                    ':created_at' => $now,
                    ':updated_at' => null,
                    ':deleted_at' => null
                ]);
            }

            $pdo->commit();
            $rowsProcessed++;
            echo "[Fila {$r}] OK -> user_id={$userId}, comunity_user_id={$comunityUserId}, username={$username}\n";

        } catch (Exception $eRow) {
            $pdo->rollBack();
            echo "[Fila {$r}] ERROR: " . $eRow->getMessage() . "\n";
            $rowsSkipped++;
            // continuar con siguiente fila
        }
    }

    echo "\nProceso finalizado. Filas procesadas: {$rowsProcessed}. Filas saltadas: {$rowsSkipped}.\n";

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