<?php
require_once("../functions.php");
if (comprobar_override(str_replace($_SERVER['DOCUMENT_ROOT'], '', __FILE__)))
    exit;
$pag = basename($_SERVER['PHP_SELF']);
comprobar_postget("post", ["nombre", "pin"], $pag, true, "/views/forms/empleado");
gen_plantilla(true, $pag, false, false, '', false, false);

//id
if (isset($_POST["id"])) {
    $id = filter_input(INPUT_POST, "id", FILTER_SANITIZE_NUMBER_INT);
}

//Nombre
$nombre = filter_input(INPUT_POST, "nombre", FILTER_SANITIZE_SPECIAL_CHARS);
//Grupo
$grupo = filter_input(INPUT_POST, "id_grupo", FILTER_SANITIZE_NUMBER_INT);
if (empty($grupo))
    $grupo = 1;
//Apellidos
$apellidos = filter_input(INPUT_POST, "apellidos", FILTER_SANITIZE_SPECIAL_CHARS);
//Teléfono
$telefono = filter_input(INPUT_POST, "telefono", FILTER_SANITIZE_SPECIAL_CHARS);
//Correo electrónico
$email = filter_input(INPUT_POST, "email", FILTER_SANITIZE_SPECIAL_CHARS);

//Tipo contrato
$tipo_contrato = filter_input(INPUT_POST, "tipo_contrato", FILTER_SANITIZE_SPECIAL_CHARS);

//Horas contrato
$horas_contrato = (!empty($_POST['horas_contrato'])) ? filter_input(INPUT_POST, "horas_contrato", FILTER_SANITIZE_NUMBER_INT) : 40;

if ($tipo_contrato == 'completo')
    $horas_contrato = 40;

//Fecha de alta
$fecha_alta = (!empty($_POST['fecha_alta'])) ? filter_input(INPUT_POST, "fecha_alta", FILTER_SANITIZE_SPECIAL_CHARS) : '2020-01-01-';

$fecha = filter_input(INPUT_POST, "fecha", FILTER_SANITIZE_SPECIAL_CHARS);
$fecha_incorporacion = filter_input(INPUT_POST, "fecha_incorporacion", FILTER_SANITIZE_SPECIAL_CHARS);

//Subcontratado
$subcontratado = 0;
if (isset($_POST['subcontratado'])) {
    $subcontratado = 1;
    $tipo_contrato = null;
    $horas_contrato = null;
    $fecha_alta = null;
}


//Usuario y contraseña
if (isset($_POST['usuario']))
    $usuario = trim(filter_input(INPUT_POST, "usuario", FILTER_SANITIZE_SPECIAL_CHARS));
if (isset($_POST['contraseña']) && !empty($_POST['contraseña']))
    $contraseña = md5(trim(filter_input(INPUT_POST, "contraseña", FILTER_SANITIZE_SPECIAL_CHARS)));

//Comprobar si el usuario existe, ya que debe ser único
if (isset($_POST['usuario'])) {
    $existe = consulta('SELECT id_empleado,usuario FROM usuarios WHERE usuario=?;', [$usuario], true);
    if (!isset($_POST["id"]) && !empty($existe)) {
        header("Location: " . SITIO_CARPETA . "/views/forms/empleado?tipo=error&mensaje=El usuario " . $usuario . " ya existe, cambia el nombre del usuario");
        exit;
    } elseif (isset($_POST["id"]) && !empty($existe) && $id != $existe[0]['id_empleado']) {
        header("Location: " . SITIO_CARPETA . "/views/forms/empleado?id=" . $id . "&tipo=error&mensaje=El usuario " . $usuario . " ya existe, cambia el nombre del usuario");
        exit;
    }
}

//Observaciones
$observaciones = filter_input(INPUT_POST, "observaciones", FILTER_SANITIZE_SPECIAL_CHARS);

//Pin
$pin = filter_input(INPUT_POST, "pin", FILTER_SANITIZE_NUMBER_INT);

//Horario regular asignado?
$horario_asignado = (isset($_POST["horario_asignado"])) ? 1 : 0;

//Horario nocturno?
$horario_nocturno = (isset($_POST["horario_nocturno"])) ? 1 : 0;

//lunes
$horas_input = [];
$dias_semana_cod = ['lun', 'mar', 'mie', 'jue', 'vie', 'sab', 'dom'];
foreach ($dias_semana_cod as $dia) {
    for ($i = 1; $i <= 10; $i++) {
        $horas_input[] = filter_input(INPUT_POST, $dia . "h" . $i, FILTER_SANITIZE_SPECIAL_CHARS) ?: '00:00:00';
    }
}

// Generar partes SQL dinámicas para horas
$cols_horas_sql = "";
$vals_horas_sql = "";
$cols_horas_update_sql = "";
foreach ($dias_semana_cod as $dia) {
    for ($i = 1; $i <= 10; $i++) {
        $cols_horas_sql .= "`{$dia}h{$i}`, ";
        $vals_horas_sql .= "?,";
        $cols_horas_update_sql .= "`{$dia}h{$i}`=?, ";
    }
}
$cols_horas_sql = rtrim($cols_horas_sql, ", ");
$vals_horas_sql = rtrim($vals_horas_sql, ",");
$cols_horas_update_sql = rtrim($cols_horas_update_sql, ", ");
if ($horario_asignado) {
    // Rellenamos con null los 70 campos de horas
    $horas_input = array_fill(0, 70, null);
}

if (!isset($_POST["id"])) {
    // Verificar si se quiere vincular con un empleado eliminado
    $vincular_empleado_eliminado = null;
    if (!empty($_POST['vincular_empleado_eliminado'])) {
        $vincular_empleado_eliminado = filter_input(INPUT_POST, "vincular_empleado_eliminado", FILTER_SANITIZE_NUMBER_INT);
        // Verificar que el ID no esté ya en uso
        $existe_id = consulta('SELECT id FROM empleados WHERE id=?;', [$vincular_empleado_eliminado], true);
        if (!empty($existe_id)) {
            header("Location: " . SITIO_CARPETA . "/views/forms/empleado?tipo=error&mensaje=El ID " . $vincular_empleado_eliminado . " ya está en uso por otro empleado");
            exit;
        }
    }

    if ($vincular_empleado_eliminado) {
        // INSERT con ID específico del empleado eliminado
        $consulta = "INSERT INTO `empleados`(`id`,`nombre`,`id_grupo`,
        `apellidos`,`telefono`,`email`,`tipo_contrato`,`contrato_horas`,`fecha_alta`,
`pin`,`subcontratado`,`observaciones`,`sin_horario_asignado`,`horario_nocturno`,`horas_acu`,
        $cols_horas_sql)
VALUES (?,?,?,
?,?,?,?,?,?,
?,?,?,?,?,0,
$vals_horas_sql);";
        $array = [
            $vincular_empleado_eliminado,
            $nombre,
            $grupo,
            $apellidos,
            $telefono,
            $email,
            $tipo_contrato,
            $horas_contrato,
            $fecha_alta,
            $pin,
            $subcontratado,
            $observaciones,
            $horario_asignado,
            $horario_nocturno,
            ...$horas_input
        ];
    } else {
        // INSERT normal sin ID (auto-increment)
        $consulta = "INSERT INTO `empleados`(`nombre`,`id_grupo`,
        `apellidos`,`telefono`,`email`,`tipo_contrato`,`contrato_horas`,`fecha_alta`,
`pin`,`subcontratado`,`observaciones`,`sin_horario_asignado`,`horario_nocturno`,`horas_acu`,
        $cols_horas_sql)
VALUES (?,?,
?,?,?,?,?,?,
?,?,?,?,?,0,
$vals_horas_sql);";
        $array = [
            $nombre,
            $grupo,
            $apellidos,
            $telefono,
            $email,
            $tipo_contrato,
            $horas_contrato,
            $fecha_alta,
            $pin,
            $subcontratado,
            $observaciones,
            $horario_asignado,
            $horario_nocturno,
            ...$horas_input
        ];
    }
} else {
    $consulta = "UPDATE `empleados` SET `nombre`=?,`id_grupo`=?,
    `apellidos`=?,`telefono`=?,`email`=?,`tipo_contrato`=?,`contrato_horas`=?,`fecha_alta`=?,
    `pin`=?,`subcontratado`=?,`observaciones`=?,`sin_horario_asignado`=?,`horario_nocturno`=?,
    $cols_horas_update_sql
 WHERE id=?;";
    $array = [
        $nombre,
        $grupo,
        $apellidos,
        $telefono,
        $email,
        $tipo_contrato,
        $horas_contrato,
        $fecha_alta,
        $pin,
        $subcontratado,
        $observaciones,
        $horario_asignado,
        $horario_nocturno,
        ...$horas_input,
        $id
    ];
}

/*******************************************************************************
 *                                 [Consulta]                                  *
 *******************************************************************************/

if (!consulta($consulta, $array, false)) {
    crear_log(
        "error",
        "Error crear/actualizar empleado",
        $pag,
        "No se ha podido crear/actualizar el empleado, porque ha ocurrido un error en la consulta."
    );
    exit;
    if (!isset($_POST["id"]))
        header("Location: " . SITIO_CARPETA . "/views/forms/empleado?tipo=error&mensaje=No se ha podido crear el empleado");
    else
        header("Location: " . SITIO_CARPETA . "/views/forms/empleado?id=$id&tipo=error&mensaje=No se ha podido actualizar el empleado");
} else {

    // Si se vinculó con empleado eliminado, eliminar de la tabla empleados_eliminados
    if (!isset($_POST["id"]) && !empty($vincular_empleado_eliminado)) {
        consulta('DELETE FROM empleados_eliminados WHERE id_empleado=?', [$vincular_empleado_eliminado], false);
        crear_log(
            "info",
            "Empleado vinculado con eliminado",
            $pag,
            "Se ha vinculado el nuevo empleado <b>[$nombre]</b> con el empleado eliminado ID: <b>[$vincular_empleado_eliminado]</b>. Sus registros históricos han sido recuperados."
        );
    }

    //Usuario y contraseña
    if (!isset($_POST["id"]) && isset($_POST['usuario']) && !empty($_POST['usuario']) && isset($_POST['contraseña']) && !empty($_POST['contraseña'])) {
        // Si se vinculó con empleado eliminado, usar ese ID; sino obtener el último insertado
        if (!empty($vincular_empleado_eliminado)) {
            $id_empleado = $vincular_empleado_eliminado;
        } else {
            $id_empleado = consulta('SELECT id FROM empleados ORDER BY id DESC LIMIT 1;', [], true)[0]['id'];
        }
        consulta(
            'INSERT INTO `usuarios`(`id_empleado`, `usuario`, `contra`, `tipo`) VALUES (?,?,?,"empleado")',
            [$id_empleado, $usuario, $contraseña],
            false
        );
    } elseif (isset($_POST["id"]) && isset($_POST['usuario']) && !empty($_POST['usuario']) && isset($_POST['contraseña']) && !empty($_POST['contraseña'])) {
        //Comprobar si existe, sino lo inserta
        $existe = consulta('SELECT id FROM usuarios WHERE id_empleado=?', [$id], true);
        if (!empty($existe)) {
            consulta(
                'UPDATE `usuarios` SET `usuario`=?,`contra`=? WHERE id_empleado=?',
                [$usuario, $contraseña, $id],
                false
            );
        } else {
            consulta(
                'INSERT INTO `usuarios`(`id_empleado`, `usuario`, `contra`, `tipo`) VALUES (?,?,?,"empleado")',
                [$id, $usuario, $contraseña],
                false
            );
        }
    } elseif (isset($_POST["id"]) && isset($_POST['usuario'])) {
        //Comprobar si existe, sino lo inserta
        $existe = consulta('SELECT id FROM usuarios WHERE id_empleado=?', [$id], true);
        if (!empty($existe)) {
            consulta(
                'UPDATE `usuarios` SET `usuario`=? WHERE id_empleado=?',
                [$usuario, $id],
                false
            );
        } else
            header("Location: " . SITIO_CARPETA . "/views/forms/empleado?id=$id&tipo=error&mensaje=No se ha podido actualizar el usuario del empleado, establece una contraseña");
    } elseif (isset($_POST["id"]) && isset($_POST['contraseña'])) {
        //Comprobar si existe, sino lo inserta
        $existe = consulta('SELECT id FROM usuarios WHERE id_empleado=?', [$id], true);
        if (!empty($existe)) {
            consulta(
                'UPDATE `usuarios` SET `contra`=? WHERE id_empleado=?',
                [$contraseña, $id],
                false
            );
        } else
            header("Location: " . SITIO_CARPETA . "/views/forms/empleado?id=$id&tipo=error&mensaje=No se ha podido actualizar la contraseña del empleado, establece un nombre de usuario");
    }

    if (isset($_POST['usuario'])) {
        $consulta2 = ' usuario=? ';
    }
    if (isset($_POST['contraseña'])) {
    }


    if (SISTEMA_CAMBIO_HORARIO_REGULAR) {
        //Agregar datos en tabla como histórico
        if (!isset($_POST["id"]))
            $id = consulta("SELECT id FROM empleados ORDER BY id DESC LIMIT 1;", [], true)[0]["id"];

        $arrayvals = [
            $id,
            date("Y-m-d"),
            ...$horas_input
        ];
        if (
            !consulta("INSERT INTO `historial_horarios`(`id_empleado`,`fecha_inicio`,
        $cols_horas_sql)
        VALUES (?,?,
        $vals_horas_sql);", $arrayvals, false)
        ) {
            crear_log(
                "error",
                "Error añadir horario historial",
                $pag,
                "No se ha podido añadir el horario al historial, porque ha ocurrido un error en la consulta."
            );
        } else {
            crear_log(
                "info",
                "Horario historial empleado añadido",
                $pag,
                "Se ha añadido el horario como historial del empleado <b>[$nombre]</b>."
            );
        }
    }
    crear_log(
        "info",
        "Empleado creado/actualizado",
        $pag,
        "Se ha creado/actualizado correctamente el empleado <b>[$nombre]</b>."
    );

    //Comprobar si ya existe registro de baja de este empleado
    $registro_baja = consulta("SELECT * FROM bajas_empleado WHERE id_empleado=?;", [$id], true);
    if (isset($_POST['baja'])) {
        if (!empty($registro_baja)) { //Si existe actualizar
            if (
                !consulta(
                    "UPDATE `bajas_empleado` SET `fecha`=?,`fecha_incorporacion`=NULL WHERE id=?;",
                    [$fecha, $registro_baja[0]['id']],
                    false
                )
            ) {
                crear_log(
                    "error",
                    "Error al dar de baja",
                    $pag,
                    "No se ha podido dar de baja al empleado, ha ocurrido un error en la consulta, con registro existente."
                );
            } else {
                crear_log(
                    "info",
                    "Empleado dado de baja",
                    $pag,
                    "Se ha dado de baja al empleado con ID: $id. Con registro existente."
                );
            }
        } else { //Sino crear baja
            if (
                !consulta(
                    "INSERT INTO `bajas_empleado`(`id_empleado`, `fecha`) VALUES (?,?);",
                    [$id, $fecha],
                    false
                )
            ) {
                crear_log(
                    "error",
                    "Error al dar de baja",
                    $pag,
                    "No se ha podido dar de baja al empleado, ha ocurrido un error en la consulta."
                );
            } else {
                crear_log(
                    "info",
                    "Empleado dado de baja",
                    $pag,
                    "Se ha dado de baja al empleado con ID: $id."
                );
            }
        }
    } else {
        //añadir fecha de incorporación
        if (
            !consulta(
                "UPDATE `bajas_empleado` SET `fecha_incorporacion`=? WHERE id=?;",
                [$fecha_incorporacion, $registro_baja[0]['id']],
                false
            )
        ) {
            crear_log(
                "error",
                "Error al dar de baja",
                $pag,
                "No se ha podido dar de baja al empleado, ha ocurrido un error en la consulta, con registro existente."
            );
        } else {
            crear_log(
                "info",
                "Empleado dado de baja",
                $pag,
                "Se ha dado de baja al empleado con ID: $id. Con registro existente."
            );
        }
    }


    if (!isset($_POST["id"]))
        header("Location: " . SITIO_CARPETA . "/views/tables/empleados?tipo=correcto&mensaje=Empleado creado correctamente");
    else
        header("Location: " . SITIO_CARPETA . "/views/tables/empleados?tipo=correcto&mensaje=Empleado actualizado correctamente");
}
