<?php

namespace App\Controllers\Seguridad;
use App\Controllers\BaseController;
use App\Controllers\GenericController;
use App\Libraries\CIAuth;
use App\Models\Perfil;
use App\Models\Permiso;
use App\Models\Modulo;
use App\Models\SubModulo;
use App\Models\DetallePerfil;

class PerfilController extends GenericController
{
    public function index(): string
    {
      
        $data = array(
            'tituloModulo' => 'Perfiles',
        );

        return view('seguridad/view_perfil',$data);
    }

    public function getModulos()
    {
        $request = \Config\Services::request();
        $perfilId = $request->getPost('perf_id');

        $moduloModel = new Modulo();
        $subModuloModel = new SubModulo();
        $perfilModel = new Perfil();
        // Obtener todos los módulos con estado verdadero
        $modulos = $moduloModel->where('modu_estado', true)->findAll();
        // Obtener submódulos por perfil
        $submodulosPerfil = $perfilModel->getSubmodulosPorPerfil($perfilId);
        $modulosArray = [];
        // Para cada módulo, obtener sus submódulos
        foreach ($modulos as $modulo) {
            // Convirtiendo a array para añadir submodulos
            $moduloArray = (array) $modulo;
            $moduloArray['submodulos'] = $subModuloModel->where('modu_id', $modulo->modu_id)->where('sumo_estado', true)->findAll();
            // Variable para determinar si algún submódulo está marcado
            $moduloChecked = false;
            // Marcar submódulos si están en el perfil
            foreach ($moduloArray['submodulos'] as $submodulo) {
                $submodulo->checked = in_array($submodulo->sumo_id, $submodulosPerfil);
                if ($submodulo->checked) {
                    $moduloChecked = true;
                }
            }
            // Marcar el módulo si al menos un submódulo está marcado
            $moduloArray['checked'] = $moduloChecked;
            $modulosArray[] = $moduloArray;
        }
        return $this->response->setJSON($modulosArray);
    }
    
    public function updatePerfilDetalle()
    {
        $request = \Config\Services::request();
        $detallePerfilModel = new DetallePerfil();

        $submodId = $request->getPost('submod_id');
        $perfId = $request->getPost('perf_id');
        $checked = $request->getPost('checked');

        if ($checked === 'true') {
            // Agregar submódulo al perfil
            $detallePerfilModel->insert([
                'perf_id' => $perfId,
                'sumo_id' => $submodId,
                'depe_estado' => true
            ]);
        } else {
            // Eliminar submódulo del perfil
            $detallePerfilModel->where('perf_id', $perfId)
                               ->where('sumo_id', $submodId)
                               ->delete();
        }

        return $this->response->setJSON(['status' => 'success']);
    }

    public function guardar(): string
    {
        $request = \Config\Services::request();
        $validation = \Config\Services::validation();

        $this->validate([
            'perf_descripcion'=>[
                'rules'=>'required|min_length[3]',
                'errors'=>[
                    'required'=>'Ingrese la descripción',
                    'min_length'=>'Descripcion deve tener como minimo 3 caracteres.',
                ]
            ]
        ]);

        if( $validation->run() == FALSE ){
            $errors = $validation->getErrors();
            return json_encode(['status'=>0,'error'=>$errors]);
        }else{
            $perfil = new Perfil();
            $success = false;

            if($request->getVar("perf_id") !== null && $request->getVar("perf_id") !== '') {

                $success = $perfil->where('perf_id', $request->getVar('perf_id'))
                    ->set([
                        'perf_descripcion' => $request->getVar('perf_descripcion')
                    ])->update();
            }else {

                $success = $perfil->save([
                    'perf_descripcion' => $request->getVar('perf_descripcion'),
                    'perf_estado' => true

                ]);
            }

            if( $success ){
                return json_encode(['status'=>1,'msg'=>'Los datos fueron guardados correctamente']);
            }else{
                return json_encode(['status'=>0,'msg'=>'Sucedio un error al guardar']);
            }
        }

    }

    public function eliminar(): string
    {
        $request = \Config\Services::request();
        $perfil = new Perfil();

        if($request->getVar("perf_id") !== null) {

            $success = $perfil->where('perf_id', $request->getVar('perf_id'))
                ->set([
                    'perf_estado' => false
                ])->update();

            if( $success ){
                return json_encode(['status'=>1,'msg'=>'Los datos fueron guardados correctamente']);
            }else{
                return json_encode(['status'=>0,'msg'=>'Sucedio un error al guardar']);
            }
        }else{
            return json_encode(['status'=>0,'msg'=>'No existe la llave primaria']);
        }
    }

    public function buscar(): string
    {
        $request = \Config\Services::request();
        $perfil = new Perfil();

        if($request->getVar('perf_id') && $request->getVar('perf_id') != '') {
            return json_encode($perfil->find($request->getVar('perf_id')));
        }
        if($request->getVar('perf_id') && $request->getVar('perf_id') != '') {
            return json_encode($perfil->where('perf_id', $request->getVar('perf_id'))->findAll());
        }
    }

  
}
