<?php
if (!defined('BASEPATH')) {
    http_response_code(403);
    die(json_encode(["success" => false, "message" => "Acceso directo no permitido"]));
}

switch ($tipo) {
    case 'getPerfiles':
        $sql = "SELECT p.*,
                       (SELECT COUNT(*) FROM usuarios u WHERE u.perfil_id = p.id AND u.activo = 1) as total_usuarios
                FROM perfiles p
                WHERE p.activo = 1
                ORDER BY p.nombre ASC";
        $result = mysqli_query($conn, $sql);

        if ($result) {
            $perfiles = [];
            while ($row = mysqli_fetch_assoc($result)) {
                // Obtener permisos del perfil
                $sqlPermisos = "SELECT per.codigo
                                FROM permisos per
                                INNER JOIN perfil_permisos pp ON per.id = pp.permiso_id
                                WHERE pp.perfil_id = " . $row['id'];
                $resultPermisos = mysqli_query($conn, $sqlPermisos);
                $permisos = [];
                while ($perm = mysqli_fetch_assoc($resultPermisos)) {
                    $permisos[] = $perm['codigo'];
                }

                $perfiles[] = [
                    'id' => (int)$row['id'],
                    'nombre' => $row['nombre'],
                    'descripcion' => $row['descripcion'],
                    'total_usuarios' => (int)$row['total_usuarios'],
                    'permisos' => $permisos,
                    'created_at' => $row['created_at']
                ];
            }
            sendResponse(true, "Perfiles obtenidos", $perfiles);
        } else {
            sendResponse(false, "Error al obtener perfiles: " . mysqli_error($conn));
        }
        break;

    case 'getPerfil':
        $id = isset($datapost['id']) ? (int)$datapost['id'] : 0;

        if ($id <= 0) {
            sendResponse(false, "ID de perfil no valido");
        }

        $sql = "SELECT * FROM perfiles WHERE id = $id AND activo = 1";
        $result = mysqli_query($conn, $sql);

        if ($result && mysqli_num_rows($result) > 0) {
            $row = mysqli_fetch_assoc($result);

            // Obtener permisos del perfil
            $sqlPermisos = "SELECT per.codigo
                            FROM permisos per
                            INNER JOIN perfil_permisos pp ON per.id = pp.permiso_id
                            WHERE pp.perfil_id = $id";
            $resultPermisos = mysqli_query($conn, $sqlPermisos);
            $permisos = [];
            while ($perm = mysqli_fetch_assoc($resultPermisos)) {
                $permisos[] = $perm['codigo'];
            }

            $perfil = [
                'id' => (int)$row['id'],
                'nombre' => $row['nombre'],
                'descripcion' => $row['descripcion'],
                'permisos' => $permisos,
                'created_at' => $row['created_at']
            ];
            sendResponse(true, "Perfil encontrado", $perfil);
        } else {
            sendResponse(false, "Perfil no encontrado");
        }
        break;

    case 'crearPerfil':
        $nombre = isset($datapost['nombre']) ? mysqli_real_escape_string($conn, $datapost['nombre']) : '';
        $descripcion = isset($datapost['descripcion']) ? mysqli_real_escape_string($conn, $datapost['descripcion']) : '';
        $permisos = isset($datapost['permisos']) ? $datapost['permisos'] : [];

        if (empty($nombre)) {
            sendResponse(false, "El nombre es requerido");
        }

        // Verificar que no exista el nombre
        $checkSql = "SELECT id FROM perfiles WHERE nombre = '$nombre'";
        $checkResult = mysqli_query($conn, $checkSql);
        if (mysqli_num_rows($checkResult) > 0) {
            sendResponse(false, "Ya existe un perfil con ese nombre");
        }

        $sql = "INSERT INTO perfiles (nombre, descripcion) VALUES ('$nombre', '$descripcion')";

        if (mysqli_query($conn, $sql)) {
            $nuevoId = mysqli_insert_id($conn);

            // Asignar permisos
            if (!empty($permisos) && is_array($permisos)) {
                foreach ($permisos as $codigo) {
                    $codigo = mysqli_real_escape_string($conn, $codigo);
                    $sqlPerm = "INSERT INTO perfil_permisos (perfil_id, permiso_id)
                                SELECT $nuevoId, id FROM permisos WHERE codigo = '$codigo'";
                    mysqli_query($conn, $sqlPerm);
                }
            }

            sendResponse(true, "Perfil creado correctamente", ['id' => $nuevoId]);
        } else {
            sendResponse(false, "Error al crear perfil: " . mysqli_error($conn));
        }
        break;

    case 'actualizarPerfil':
        $id = isset($datapost['id']) ? (int)$datapost['id'] : 0;
        $nombre = isset($datapost['nombre']) ? mysqli_real_escape_string($conn, $datapost['nombre']) : '';
        $descripcion = isset($datapost['descripcion']) ? mysqli_real_escape_string($conn, $datapost['descripcion']) : '';
        $permisos = isset($datapost['permisos']) ? $datapost['permisos'] : [];

        if ($id <= 0 || empty($nombre)) {
            sendResponse(false, "Datos incompletos");
        }

        // Verificar que no exista el nombre en otro perfil
        $checkSql = "SELECT id FROM perfiles WHERE nombre = '$nombre' AND id != $id";
        $checkResult = mysqli_query($conn, $checkSql);
        if (mysqli_num_rows($checkResult) > 0) {
            sendResponse(false, "Ya existe un perfil con ese nombre");
        }

        $sql = "UPDATE perfiles SET
                nombre = '$nombre',
                descripcion = '$descripcion',
                updated_at = NOW()
                WHERE id = $id";

        if (mysqli_query($conn, $sql)) {
            // Eliminar permisos actuales
            mysqli_query($conn, "DELETE FROM perfil_permisos WHERE perfil_id = $id");

            // Asignar nuevos permisos
            if (!empty($permisos) && is_array($permisos)) {
                foreach ($permisos as $codigo) {
                    $codigo = mysqli_real_escape_string($conn, $codigo);
                    $sqlPerm = "INSERT INTO perfil_permisos (perfil_id, permiso_id)
                                SELECT $id, id FROM permisos WHERE codigo = '$codigo'";
                    mysqli_query($conn, $sqlPerm);
                }
            }

            sendResponse(true, "Perfil actualizado correctamente");
        } else {
            sendResponse(false, "Error al actualizar perfil: " . mysqli_error($conn));
        }
        break;

    case 'eliminarPerfil':
        $id = isset($datapost['id']) ? (int)$datapost['id'] : 0;

        if ($id <= 0) {
            sendResponse(false, "ID de perfil no valido");
        }

        // Verificar que no sea el perfil Administrador
        $checkSql = "SELECT nombre FROM perfiles WHERE id = $id";
        $checkResult = mysqli_query($conn, $checkSql);
        $row = mysqli_fetch_assoc($checkResult);

        if ($row['nombre'] == 'Administrador') {
            sendResponse(false, "No se puede eliminar el perfil de Administrador");
        }

        // Verificar que no tenga usuarios asignados
        $userSql = "SELECT COUNT(*) as total FROM usuarios WHERE perfil_id = $id AND activo = 1";
        $userResult = mysqli_query($conn, $userSql);
        $userRow = mysqli_fetch_assoc($userResult);

        if ($userRow['total'] > 0) {
            sendResponse(false, "No se puede eliminar el perfil porque tiene usuarios asignados");
        }

        // Soft delete
        $sql = "UPDATE perfiles SET activo = 0, updated_at = NOW() WHERE id = $id";

        if (mysqli_query($conn, $sql)) {
            // Eliminar permisos del perfil
            mysqli_query($conn, "DELETE FROM perfil_permisos WHERE perfil_id = $id");
            sendResponse(true, "Perfil eliminado correctamente");
        } else {
            sendResponse(false, "Error al eliminar perfil: " . mysqli_error($conn));
        }
        break;

    case 'getPermisos':
        $sql = "SELECT * FROM permisos WHERE activo = 1 ORDER BY modulo, nombre";
        $result = mysqli_query($conn, $sql);

        if ($result) {
            $permisos = [];
            while ($row = mysqli_fetch_assoc($result)) {
                $permisos[] = [
                    'id' => (int)$row['id'],
                    'codigo' => $row['codigo'],
                    'nombre' => $row['nombre'],
                    'descripcion' => $row['descripcion'],
                    'modulo' => $row['modulo']
                ];
            }
            sendResponse(true, "Permisos obtenidos", $permisos);
        } else {
            sendResponse(false, "Error al obtener permisos: " . mysqli_error($conn));
        }
        break;

    default:
        sendResponse(false, "Operacion no valida en Perfiles");
        break;
}
