<?php
require __DIR__ . '/../../../config/funciones/funciones.php';
include __DIR__ . '/../../layouts/admin/header.php';
include __DIR__ . '/../../../config/db/db.php';
$cat = $_GET['cat'] ?? null;
$alertas = [];

if(!$cat || !isset($catalogos[$cat])){
    // Ajustar esto, tiene que llevar al menú principal
    header('Location: ../index.php');
}

$conf = $catalogos[$cat];

$titulo = $conf['titulo'];
$tabla = $conf['tabla'];
$campo = $conf['campo'];
$extension = $conf['extension'];
$fecha = date('Y-m-d');
$fecha_modifica_Campo = $conf['fecha_modifica'];
$fecha_alta_Campo = $conf['fecha_alta'];
$id_Campo = $conf['id'];

$estatus_Campo = null;

$modo_edicion = false;
$registro = [];

if(isset($_GET['id']) && filter_var($_GET['id'], FILTER_VALIDATE_INT)){
    $modo_edicion = true;
    $id_registro = (int) $_GET['id'];

    $query = "SELECT * FROM {$tabla} WHERE {$id_Campo} = :id LIMIT 1";
    $stmt = $pdo->prepare($query);
    $stmt->bindValue(':id', $id_registro, PDO::PARAM_INT);
    $stmt->execute();

    $registro = $stmt->fetch(PDO::FETCH_ASSOC);

    if(!$registro){
        header("Location: index.php?cat=$cat");
        exit;
    }
}

if($cat !== 'estatus') {
    $estatus_Campo = $conf['estatus'];
}

$regexTexto = "/^\p{L}+(?: \p{L}+)*$/u";

if (!preg_match('/^[a-zA-Z_]+$/', $tabla) || !preg_match('/^[a-zA-Z_]+$/', $campo)) {
    die('Configuración inválida');
}

$id_Estatus = 1;
if(isset($_GET['id']) && filter_var($_GET['id'], FILTER_VALIDATE_INT)) {
    $id_Estatus = $_GET['id'];
}


if($cat === 'municipios') {
    $estadosLista = [];
    try {
        $query = " SELECT * FROM estado_tbl ";
        $stmt = $pdo->prepare($query);
        $stmt->execute();

        $estados = $stmt->fetchAll(PDO::FETCH_ASSOC);
    } catch (\Throwable $th) {
        //throw $th;
    }

    foreach($estados as $estado) {
        $estadosLista[] = $estado['Nombre_Estado'];
    }

}

if($cat === 'nacionalidad') {
    $gentilicio_masculino_Campo = $conf['gentilicio_masculino'];
    $gentilicio_femenino_Campo = $conf['gentilicio_femenino'];
}

if($_SERVER['REQUEST_METHOD'] === 'POST') {
    //debuguear($_POST);
    $Descripcion = $_POST['nombre'.$cat] ?? null;
    $Descripcion = trim(s($Descripcion));

    if($cat === 'nacionalidad') {
        $gentilicio_masculino_Campo = $conf['gentilicio_masculino'];
        $gentilicio_femenino_Campo = $conf['gentilicio_femenino'];

        $gentilicioMasculino = $_POST['nombreGentilicioMasculino'];
        $gentilicioFemenino = $_POST['nombreGentilicioFemenino'];

        //Validaciones
        if ($Descripcion === '') {
            $alertas[] = "La $titulo es obligatorio";
        } 
        elseif (!preg_match($regexTexto, $Descripcion)) {
            $alertas[] = "La $titulo solo puede contener letras";
        } 
        elseif (mb_strlen($Descripcion) < 3) {
            $alertas[] = "La $titulo debe tener al menos 3 caracteres";
        } 
        elseif (mb_strlen($Descripcion) > $extension) {
            $alertas[] = "La $titulo es demasiado largo";
        }
            //Validaciones
        if ($gentilicioMasculino === '') {
            $alertas[] = "El Gentilicio Masculino es obligatorio";
        } 
        elseif (!preg_match($regexTexto, $gentilicioMasculino)) {
            $alertas[] = "El Gentilicio Masculino solo puede contener letras";
        } 
        elseif (mb_strlen($gentilicioMasculino) < 3) {
            $alertas[] = "El Gentilicio Masculino debe tener al menos 3 caracteres";
        } 
        elseif (mb_strlen($gentilicioMasculino) > $extension) {
            $alertas[] = "El Gentilicio Masculino es demasiado largo";
        }
            //Validaciones
        if ($gentilicioFemenino === '') {
            $alertas[] = "El Gentilicio Femenino es obligatorio";
        } 
        elseif (!preg_match($regexTexto, $gentilicioFemenino)) {
            $alertas[] = "El Gentilicio Femenino solo puede contener letras";
        } 
        elseif (mb_strlen($gentilicioFemenino) < 3) {
            $alertas[] = "El Gentilicio Femenino debe tener al menos 3 caracteres";
        } 
        elseif (mb_strlen($gentilicioFemenino) > $extension) {
            $alertas[] = "El Gentilicio Femenino es demasiado largo";
        } 
    } else if($cat === 'municipios') {
        
        $id_estado = $_POST['id_Estado'] ?? null;

        // Validar que sea número entero válido
        if(!$id_estado || !filter_var($id_estado, FILTER_VALIDATE_INT)) {
            $alertas[] = "Debes seleccionar un estado válido";
        } else {

            // Verificar que exista en la base de datos
            $stmt = $pdo->prepare("SELECT id_Estado FROM estado_tbl WHERE id_Estado = :id LIMIT 1");
            $stmt->bindValue(':id', $id_estado, PDO::PARAM_INT);
            $stmt->execute();

            if($stmt->rowCount() === 0) {
                $alertas[] = "El estado seleccionado no es válido";
            }
        }

        //Validaciones
        if ($Descripcion === '') {
            $alertas[] = "El $titulo es obligatorio";
        } 
        elseif (!preg_match($regexTexto, $Descripcion)) {
            $alertas[] = "El $titulo solo puede contener letras";
        } 
        elseif (mb_strlen($Descripcion) < 3) {
            $alertas[] = "El $titulo debe tener al menos 3 caracteres";
        } 
        elseif (mb_strlen($Descripcion) > $extension) {
            $alertas[] = "El $titulo es demasiado largo";
        }

    } else {
        //Validaciones
        if ($Descripcion === '') {
            $alertas[] = "El $titulo es obligatorio";
        } 
        elseif (!preg_match($regexTexto, $Descripcion)) {
            $alertas[] = "El $titulo solo puede contener letras";
        } 
        elseif (mb_strlen($Descripcion) < 3) {
            $alertas[] = "El $titulo debe tener al menos 3 caracteres";
        } 
        elseif (mb_strlen($Descripcion) > $extension) {
            $alertas[] = "El $titulo es demasiado largo";
        }
    }


    if(empty($alertas)) {

                try {

                    if($modo_edicion) {

            if($cat === 'estatus') {

                $query = "UPDATE {$tabla}
                        SET {$campo} = :descripcion,
                            {$fecha_modifica_Campo} = :fecha_modifica
                        WHERE {$id_Campo} = :id";

                $stmt = $pdo->prepare($query);
                $stmt->bindValue(':descripcion', $Descripcion);
                $stmt->bindValue(':fecha_modifica', $fecha);
                $stmt->bindValue(':id', $id_registro, PDO::PARAM_INT);

            } elseif($cat === 'nacionalidad') {

                $query = "UPDATE {$tabla}
                        SET {$campo} = :descripcion,
                            {$gentilicio_masculino_Campo} = :gentilicio_masculino,
                            {$gentilicio_femenino_Campo} = :gentilicio_femenino,
                            {$fecha_modifica_Campo} = :fecha_modifica
                        WHERE {$id_Campo} = :id";

                $stmt = $pdo->prepare($query);
                $stmt->bindValue(':descripcion', $Descripcion);
                $stmt->bindValue(':gentilicio_masculino', $gentilicioMasculino);
                $stmt->bindValue(':gentilicio_femenino', $gentilicioFemenino);
                $stmt->bindValue(':fecha_modifica', $fecha);
                $stmt->bindValue(':id', $id_registro, PDO::PARAM_INT);

            } elseif($cat === 'municipios') {

                $query = "UPDATE {$tabla}
                        SET {$campo} = :descripcion,
                            id_Estado_Municipio = :id_estado,
                            {$fecha_modifica_Campo} = :fecha_modifica
                        WHERE {$id_Campo} = :id";

                $stmt = $pdo->prepare($query);
                $stmt->bindValue(':descripcion', $Descripcion);
                $stmt->bindValue(':id_estado', $id_estado, PDO::PARAM_INT);
                $stmt->bindValue(':fecha_modifica', $fecha);
                $stmt->bindValue(':id', $id_registro, PDO::PARAM_INT);

            } else {

                $query = "UPDATE {$tabla}
                        SET {$campo} = :descripcion,
                            {$fecha_modifica_Campo} = :fecha_modifica
                        WHERE {$id_Campo} = :id";

                $stmt = $pdo->prepare($query);
                $stmt->bindValue(':descripcion', $Descripcion);
                $stmt->bindValue(':fecha_modifica', $fecha);
                $stmt->bindValue(':id', $id_registro, PDO::PARAM_INT);
            }

            $stmt->execute();

            header("Location: index.php?cat=$cat&alerta=exito");
            exit;
        } else {

            if($cat === 'estatus') {
                
                $query = "INSERT INTO {$tabla} ({$campo}, {$fecha_modifica_Campo}, {$fecha_alta_Campo}) 
                VALUES (:descripcion, :fecha_modifica, :fecha_alta)";

                $stmt = $pdo->prepare($query);
                $stmt->bindValue(':descripcion', $Descripcion);
                $stmt->bindValue(':fecha_modifica', $fecha);
                $stmt->bindValue(':fecha_alta', $fecha);

                $stmt->execute();
                header("Location: index.php?cat=$cat&alerta=exito");
                exit;
            } else {
                $id_Estatus = 1;

                if($cat === 'nacionalidad') {
                    $query = "INSERT INTO {$tabla} ({$campo}, {$fecha_modifica_Campo}, {$fecha_alta_Campo}, {$estatus_Campo}, {$gentilicio_masculino_Campo}, {$gentilicio_femenino_Campo}) 
                        VALUES (:descripcion, :fecha_modifica, :fecha_alta, :estatus, :gentilicio_masculino, :gentilicio_femenino)";
    
                    $stmt = $pdo->prepare($query);
                    $stmt->bindValue(':descripcion', $Descripcion);
                    $stmt->bindValue(':gentilicio_masculino', $gentilicioMasculino);
                    $stmt->bindValue(':gentilicio_femenino', $gentilicioFemenino);
                    $stmt->bindValue(':fecha_modifica', $fecha);
                    $stmt->bindValue(':fecha_alta', $fecha);
                    $stmt->bindValue(':estatus', $id_Estatus, PDO::PARAM_INT);
    
                    $stmt->execute();
                    header("Location: index.php?cat=$cat&alerta=exito");
                    exit;
                } else if($cat === 'municipios') {
                    $query = "INSERT INTO {$tabla} 
                    ({$campo}, id_Estado_Municipio, {$fecha_modifica_Campo}, {$fecha_alta_Campo}, {$estatus_Campo}) 
                    VALUES (:descripcion, :id_estado, :fecha_modifica, :fecha_alta, :estatus)";

    
                    $stmt = $pdo->prepare($query);
                    $stmt->bindValue(':descripcion', $Descripcion);
                    $stmt->bindValue(':fecha_modifica', $fecha);
                    $stmt->bindValue(':fecha_alta', $fecha);
                    $stmt->bindValue(':estatus', $id_Estatus, PDO::PARAM_INT);
                    $stmt->bindValue(':id_estado', $id_estado, PDO::PARAM_INT);
    
                    $stmt->execute();
                    header("Location: index.php?cat=$cat&alerta=exito");
                    exit;
                    
                } else {
                    $query = "INSERT INTO {$tabla} ({$campo}, {$fecha_modifica_Campo}, {$fecha_alta_Campo}, {$estatus_Campo}) 
                        VALUES (:descripcion, :fecha_modifica, :fecha_alta, :estatus)";
    
                    $stmt = $pdo->prepare($query);
                    $stmt->bindValue(':descripcion', $Descripcion);
                    $stmt->bindValue(':fecha_modifica', $fecha);
                    $stmt->bindValue(':fecha_alta', $fecha);
                    $stmt->bindValue(':estatus', $id_Estatus, PDO::PARAM_INT);
    
                    $stmt->execute();
                    header("Location: index.php?cat=$cat&alerta=exito");
                    exit;
                }
            }
            
        }
        } catch (PDOException $e) {

            // 23000 = violación de restricción (UNIQUE)
            if($cat === 'nacionalidad') {
                if ($e->getCode() === '23000') {
                    $alertas[] = "Esa $titulo ya existe";
                } else {
                    $alertas[] = "Error al guarar la $titulo";
                }

            } else {
                if ($e->getCode() === '23000') {
                    $alertas[] = "Ese $titulo ya existe";
                } else {
                    $alertas[] = "Error al guarar el $titulo";
                }
            }
            //debuguear($e->getMessage());

        }
    }
}



?>

<main>

    <h1 class="titulo-h1">Catálogo de <?php echo $titulo; ?></h1>

    <?php if(!empty($alertas)) { ?>
        <?php foreach($alertas as $error) { ?>
            <p class="alerta alerta--error"><?php echo $error; ?></p>
        <?php } ?>
    <?php } ?>

    <form class="formulario-catalogo" method="POST">
        <a class="formulario-catalogo__btn--volver" href="index.php?cat=<?php echo $cat; ?>">Volver</a>
        
        <fieldset class="formulario-catalogo__fieldset">
            <?php if($cat === 'nacionalidad') { ?>
                <label class="formulario-catalogo__label" for="nombre<?php echo $cat; ?>">País</label>
                <input class="formulario-catalogo__input" type="text" name="nombre<?php echo $cat; ?>" id="nombre<?php echo $cat; ?>" value="<?php echo $modo_edicion && isset($registro['Pais_Nacionalidad']) ? $registro['Pais_Nacionalidad'] : ''; ?>">

                <label class="formulario-catalogo__label" for="nombreGentilicioMasculino">Gentilicio Masculino</label>
                <input class="formulario-catalogo__input" type="text" name="nombreGentilicioMasculino" id="nombreGentilicioMasculino" value="<?php echo $modo_edicion && isset($registro[$gentilicio_masculino_Campo]) ? $registro[$gentilicio_masculino_Campo] : ''; ?>">

                <label class="formulario-catalogo__label" for="nombreGentilicioFemenino">Gentilicio Femenino</label>
                <input class="formulario-catalogo__input" type="text" name="nombreGentilicioFemenino" id="nombreGentilicioFemenino" value="<?php echo $modo_edicion && isset($registro[$gentilicio_femenino_Campo]) ? $registro[$gentilicio_femenino_Campo] : ''; ?>">

            <?php } else if($cat === 'municipios') { ?>
                <label class="formulario-catalogo__label" for="nombre<?php echo $cat; ?>">Estado</label>
                <select class="formulario-catalogo__input" name="id_Estado" id="id_Estado" required>
                    <option class="formulario-catalogo__input" value="" disabled selected>- Selecciona una opción -</option>
                    <?php foreach($estados as $estado) { ?>
                        <option class="formulario-catalogo__input" value="<?php echo $estado['id_Estado'] ?>"><?php echo $estado['Nombre_Estado'] ?></option>
                    <?php } ?>
                </select>

                <label class="formulario-catalogo__label" for="nombre<?php echo $cat; ?>">Nombre</label>
                <input class="formulario-catalogo__input" type="text" name="nombre<?php echo $cat; ?>" id="nombre<?php echo $cat; ?>">
            
            <?php } else { ?>
                <label class="formulario-catalogo__label" for="nombre<?php echo $cat; ?>">Nombre</label>
                <input class="formulario-catalogo__input" type="text" name="nombre<?php echo $cat; ?>" id="nombre<?php echo $cat; ?>" value="<?php echo $modo_edicion ? $registro[$campo] : ''; ?>">
            <?php } ?>


        </fieldset>

        <button class="formulario-catalogo__btn"><?php echo $modo_edicion ? 'Actualizar' : 'Guardar'; ?></button>
    </form>
</main>

<?php include __DIR__ . '/../../layouts/admin/footer.php'; ?>