<?php

namespace App\Controllers;

use CodeIgniter\Exceptions\PageNotFoundException;
use App\Models\FormulariosModel;
use App\Models\UsuarioModel;
use App\Models\PerfilModel;
use App\Models\RespuestasGestionesModel;
use App\Models\RespuestasModel;
use App\Models\RespuestasHistorialModel;
use App\Models\OrganizacionModel;

class Modulos extends BaseController
{
    protected $formulariosModel;
    protected $usuarioModel;
    protected $perfilModel;
    protected $respuestasGestionesModel;
    protected $respuestasModel;
    protected $respuestasHistorialModel;
    protected $organizacionModel;

    public function __construct()
    {
        $this->formulariosModel = new FormulariosModel();
        $this->usuarioModel = new UsuarioModel();
        $this->perfilModel = new PerfilModel();
        $this->respuestasGestionesModel = new RespuestasGestionesModel();
        $this->respuestasModel = new RespuestasModel();
        $this->respuestasHistorialModel = new RespuestasHistorialModel();
        $this->organizacionModel = new OrganizacionModel();
    }

    public function index(): string
    {
        permiso('Módulos','Visualizar',true);
        return view('modulos/index');
    }

    public function create()
    {
        permiso('Módulos','Crear',true);
        $data = [];
        return view('modulos/create',$data);
    }

    public function store()
    {
        $data = $this->request->getPost();

        $data["usuario_creador_id"]=session()->get('usuario')["id"];
    
        $this->formulariosModel->save($data);

        return $this->response->setJSON([
                'success' => true,
                'message' => 'Módulo creado correctamente.',
                'data' => [
                    'user' => $data
                ]
            ]);
    }

    public function edit($id)
    {
        permiso('Módulos','Editar',true);
        $data['formulario'] = $this->formulariosModel->find($id);
        $data['usuarios']= $this->usuarioModel->findAll();
        $data['perfiles']= $this->perfilModel->findAll();
        return view('modulos/edit', $data);
    }

    public function update($id)
    {
        $data = $this->request->getPost();
 
        
        $formulario=[
            "nombre"=>$data['nombre'],
            "activo"=>$data['activo'],
            "tipo_derivacion_inicial"=>$data['tipo_derivacion_inicial'],
            "usuario_derivacion_inicial"=>$data['usuario_derivacion_inicial'],
            "perfil_derivacion_inicial"=>$data['perfil_derivacion_inicial'],
        ];

    
        $this->formulariosModel->update($id, $formulario);

        return $this->response->setJSON([
                'success' => true,
                'message' => 'Módulo editado correctamente.',
                'data' => [
                    'user' => $data
                ]
            ]);
    }

     public function api_save_esquema($id)
    {
        $data = $this->request->getPost();

        //falta cambiar la versión
        $this->formulariosModel->update($id, $data);

        return $this->response->setJSON([
                'success' => true,
                'message' => 'Esquema actualizado correctamente.',
                'data' => [
                    'user' => $data
                ]
            ]);
    }

    public function delete($id)
    {
        permiso('Módulos','Eliminar',true);
        $this->formulariosModel->delete($id);
        return redirect()->to('/usuario')->with('success', 'Módulo eliminado.');
    }

    public function datatable()
    {
        permiso('Módulos','Visualizar',true);
        $json = $this->formulariosModel->getDatatable($this->request);
        return $this->response->setJSON($json);
    }

    /*
     // 1. Validar permisos
        if (!permiso('Módulos','Guardar respuestas')) {
            return $this->response->setJSON([
                "success" => false,
                "message" => "No tienes permitido guardar respuestas"
            ]);
        }
    */

    public function old_save_response()
    {
        // 1. Validar permisos
        if (!permiso('Módulos','Guardar respuestas')) {
            return $this->response->setJSON([
                "success" => false,
                "message" => "No tienes permitido guardar respuestas"
            ]);
        }

        // 2. Obtener POST
        $json          = $this->request->getPost('json');
        $item          = $this->request->getPost('item');
        $item_id       = $this->request->getPost('item_id');
        $formulario_id = $this->request->getPost('formulario_id');
        $respuesta_id  = $this->request->getPost('respuesta_id');

        // 3. Validar JSON
        $decoded = json_decode($json, true);
        if (json_last_error() !== JSON_ERROR_NONE) {
            return $this->response->setJSON([
                "success" => false,
                "message" => "El JSON recibido es inválido"
            ]);
        }

        // 4. Usuario de sesión
        $usuario_id = session()->get('usuario')['id'];

        // 5. Cargar modelos
        $respuestasModel  = new \App\Models\RespuestasModel();
        $formulariosModel = new \App\Models\FormulariosModel();

        // 6. Obtener versión del formulario
        $form = $formulariosModel->find($formulario_id);
        if (!$form) {
            return $this->response->setJSON([
                "success" => false,
                "message" => "No se encontró el formulario especificado"
            ]);
        }

        $version_formulario = $form['version_actual'];  // <<--- AQUÍ

        // 7. CREAR RESPUESTA si respuesta_id no viene
        if (empty($respuesta_id)) 
        {
            $dataInsert = [
                "usuario_id"       => $usuario_id,
                "formulario_id"    => $formulario_id,
                "item"             => $item,
                "item_id"          => $item_id,
                "uniqid"           => uniqid(),
                "data"             => $json,
                "fecha_respuesta"  => date('Y-m-d H:i:s'),
               
                "estado"           => "pendiente",
                "version"          => $version_formulario,   // <<--- VERSIÓN
            ];

            $newId = $respuestasModel->insert($dataInsert);

            return $this->response->setJSON([
                "success" => true,
                "message" => "Respuesta creada correctamente",
                "respuesta_id" => $newId
            ]);
        }

        // 8. ACTUALIZAR RESPUESTA EXISTENTE
        $respuesta = $respuestasModel->find($respuesta_id);

        if (!$respuesta) {
            return $this->response->setJSON([
                "success" => false,
                "message" => "No se encontró la respuesta indicada"
            ]);
        }
    
        $historial=$respuesta["historial"]==null ? [] : $respuesta["historial"]; 
        $historial=json_decode($historial,true);
        $actual_data=[
            "data"=>json_decode($respuesta["data"],true),
            "esquema"=>json_decode($respuesta["esquema"],true),
            "fecha_modificacion"=>date('Y-m-d H:i:s'),
            "usuario_modificador_id"=>session()->get('usuario')["id"],
            "usuario_modificador_nombre"=>session()->get('usuario')["nombre"],
        ];
        $historial[]=$actual_data;
        $historial=json_encode($historial);

        $dataUpdate = [
            "data"               => $json,
            "fecha_modificacion" => date('Y-m-d H:i:s'),
            "esquema"=>$form["esquema"],
            "version"=>$form["version_actual"],
            "usuario_id"=>session()->get('usuario')["id"],
            "fecha_respuesta"=>date('Y-m-d H:i:s'),
            "historial"=>$historial
            // NOTA: NO se modifica la versión
        ];

        $respuestasModel->update($respuesta_id, $dataUpdate);

        return $this->response->setJSON([
            "success" => true,
            "message" => "Respuesta actualizada correctamente",
            "respuesta_id" => $respuesta_id
        ]);
    }

    public function save_response()
    {
        // 1. Validar permisos
        if (!permiso('Módulos','Guardar respuestas')) {
            return $this->response->setJSON([
                "success" => false,
                "message" => "No tienes permitido guardar respuestas"
            ]);
        }

        // 2. Obtener POST
        $json          = $this->request->getPost('json');
        $item          = $this->request->getPost('item');
        $item_id       = $this->request->getPost('item_id');
        $formulario_id = $this->request->getPost('formulario_id');
        $respuesta_id  = $this->request->getPost('respuesta_id');

        // 3. Validar JSON
        $decoded = json_decode($json, true);
        if (json_last_error() !== JSON_ERROR_NONE) {
            return $this->response->setJSON([
                "success" => false,
                "message" => "El JSON recibido es inválido"
            ]);
        }

        // 4. Usuario de sesión
        $usuario_id = session()->get('usuario')['id'];

        // 5. Cargar modelos
     
        $formulariosModel = new \App\Models\FormulariosModel();
          $respuestasModel = new \App\Models\RespuestasModel();

        // 6. Obtener versión del formulario
        $form = $this->formulariosModel->find($formulario_id);
        if (!$form) {
            return $this->response->setJSON([
                "success" => false,
                "message" => "No se encontró el formulario especificado"
            ]);
        }

        if ($form["tipo_derivacion_inicial"]==null) {
           /* return $this->response->setJSON([
                "success" => false,
                "message" => "No se configuró el tipo de derivación inicial del formulario"
            ]); */
        }

        if ($form["tipo_derivacion_inicial"]=='usuario_especifico' && $form["usuario_derivacion_inicial"]==null) {
           /* return $this->response->setJSON([
                "success" => false,
                "message" => "No se configuró el usuario de derivación inicial del formulario"
            ]);*/
        }

        $version_formulario = $form['version_actual'];  // <<--- AQUÍ

        // 7. CREAR RESPUESTA si respuesta_id no viene
        if (empty($respuesta_id)) 
        {
            $usuario_asignado_id=null;
            $perfil_asignado_id=null;
            if ($form["tipo_derivacion_inicial"]=='usuario_especifico') {
                $usuario_asignado_id=$form["usuario_derivacion_inicial"];
            }
            if ($form["tipo_derivacion_inicial"]=='usuario_creador') {
                $usuario_asignado_id=session()->get('usuario')["id"];
            }
            if ($form["tipo_derivacion_inicial"]=='jefe_directo') {
                $usuario_asignado_id=session()->get('usuario')["jefe_directo_id"];
            }
            if ($form["tipo_derivacion_inicial"]=='perfil_especifico') {
                $perfil_asignado_id=$form["perfil_derivacion_inicial"];
            }

            /*
            if ($usuario_asignado_id==null) {
                return $this->response->setJSON([
                    "success" => false,
                    "message" => "No se pudo determinar el usuario asignado para la gestión inicial"
                ]);
            }*/

            $dataInsert = [
                "usuario_id"       => $usuario_id,
                "formulario_id"    => $formulario_id,
                "item"             => $item,
                "item_id"          => $item_id,
                "uniqid"           => uniqid(),
                "data"             => $json,
                "esquema"=>$form["esquema"],
                "fecha_respuesta"  => date('Y-m-d H:i:s'),
                "usuario_asignado_id" => $usuario_asignado_id,
                "perfil_asignado_id"=>$perfil_asignado_id,
                "estado"           => "pendiente",
                "version"          => $version_formulario,   // <<--- VERSIÓN
            ];

            $newId = $respuestasModel->insert($dataInsert);

            //CREAR GESTIÓN INICIAL
            $gestion_inicial=[
                "respuesta_id"=>$newId,
                "estado_respuesta"=>"pendiente",
                "estado_gestion"=>"en proceso",
                "fecha_creacion"=>date('Y-m-d H:i:s'),
                "usuario_creador_id"=>session()->get('usuario')["id"],
                "usuario_asignado_id"=>$usuario_asignado_id,
                "perfil_asignado_id"=>$perfil_asignado_id,
                "tipo"=>"derivacion_inicial",
                "archivos"=>null,
                "comentarios"=>"Gestión inicial creada automáticamente al guardar respuesta"
            ];
            $this->respuestasGestionesModel->save($gestion_inicial);

            if ($usuario_asignado_id!=null) {
                 $emailData = [
                    'respuesta_id'      => $gestion_inicial['respuesta_id'],
                    'tipo'              => $gestion_inicial['tipo'],
                    'estado'            => $gestion_inicial['estado_respuesta'],
                    'fecha_creacion'    => $gestion_inicial['fecha_creacion'],
                    'usuario_creador'   => session()->get('usuario')["nombre"],   // string
                    'usuario_asignado'  => get_user($usuario_asignado_id)["nombre"] ,  // string
                    'comentarios'       => $gestion_inicial['comentarios'],
                ];
                $mensaje = view('email/gestion_inicial', $emailData);
                $para=get_user($usuario_asignado_id)["email"] ?? 'notfound@mail.com';
                sendEmail($para, 'Nueva solicitud '.$form["nombre"], $mensaje);
            }
           
            /*
            $notificacion=[
				"titulo"=>"Nueva solicitud asignada: ".$form["nombre"],
				"enlace"=>site_url()."modulos/gestionar/".$dataInsert["uniqid"],
				"cuerpo"=>'Se ha creado una nueva solicitud y se te ha asignado para su gestión.',
				"usuario_id"=>$usuario_asignado_id,
				"visto"=>0,
				"usuario_origen_id"=>session()->get('usuario')["id"]
			];
			nueva_notificacion($notificacion);*/

            return $this->response->setJSON([
                "success" => true,
                "message" => "Respuesta creada correctamente",
                "respuesta_id" => $newId,
                "data_insert" => $dataInsert
            ]);
        }

        // 8. ACTUALIZAR RESPUESTA EXISTENTE
        $respuesta = $respuestasModel->find($respuesta_id);

        if (!$respuesta) {
            return $this->response->setJSON([
                "success" => false,
                "message" => "No se encontró la respuesta indicada"
            ]);
        }
    
        $historial=$respuesta["historial"]==null ? "[]" : $respuesta["historial"]; 
        $historial=json_decode($historial,true);
        $actual_data=[
            "data"=>json_decode($respuesta["data"],true),
            "esquema"=>json_decode($respuesta["esquema"],true),
            "fecha_modificacion"=>date('Y-m-d H:i:s'),
            "usuario_modificador_id"=>session()->get('usuario')["id"],
            "usuario_modificador_nombre"=>session()->get('usuario')["nombre"],
        ];
        $historial[]=$actual_data;
        $historial=json_encode($historial);

        $respuesta["respuesta_id"]=$respuesta["id"];
        $respuesta["usuario_creador"]=json_encode(session()->get('usuario'));
        unset($respuesta['id']);
        $this->respuestasHistorialModel->insert($respuesta);

        $dataUpdate = [
            "data"               => $json,
            "fecha_modificacion" => date('Y-m-d H:i:s'),
            "esquema"=>$form["esquema"],
            "version"=>$form["version_actual"],
            "usuario_id"=>session()->get('usuario')["id"],
            "fecha_respuesta"=>date('Y-m-d H:i:s'),
            "historial"=>$historial
            // NOTA: NO se modifica la versión
        ];

        $respuestasModel->update($respuesta_id, $dataUpdate);

        return $this->response->setJSON([
            "success" => true,
            "message" => "Respuesta actualizada correctamente",
            "respuesta_id" => $respuesta_id
        ]);
    }

    public function datatablebandeja()
    {
       
        permiso('Módulos','Bandeja',true);
        $json = $this->respuestasModel->getDatatable($this->request);
        return $this->response->setJSON($json);
    }

    public function datatablebandejacreador()
    {
       
        permiso('Módulos','Visualizar',true);
        $json = $this->respuestasModel->getDatatable($this->request);
        return $this->response->setJSON($json);
    }
    

    public function bandeja()
    {
        //die('MÓDULO EN CONSTRUCCIÓN');
        permiso('Módulos','Bandeja',true);
        $data = [];
        return view('modulos/bandeja',$data);
    }

    public function bandeja_creador()
    {
        //die('MÓDULO EN CONSTRUCCIÓN');
        permiso('Módulos','Visualizar',true);
        $data = [];
        return view('modulos/bandeja_creador',$data);
    }

    public function render($formulario_id=null)
    {
        helper('formulario');
        helper('respuesta');
        permiso('Módulos Visualizar',true);
       
        $data = [
            "formulario_id"=>$formulario_id,
        ];
        $data['formulario'] = $this->formulariosModel->find($formulario_id);
        return view('modulos/show',$data); 
    }

    
    public function ver_historial($id=null)
    {
        helper('formulario');
        helper('respuesta');
        permiso('Módulos Visualizar',true);
       
        $data = [
            "id"=>$id,
        ];
        $data['respuesta'] = $this->respuestasHistorialModel->find($id);
        if ($data["respuesta"]==null) {
            die('No se encontró registro');
        }
        $data['formulario'] = $this->formulariosModel->find($data['respuesta']["formulario_id"]);
        $data["organizacion"] = $this->organizacionModel->find($data['respuesta']["item_id"]);
        return view('modulos/show_historial',$data); 
    }

    public function gestionar_creador($respuesta_id=null){
        helper('formulario');
        helper('respuesta');
        permiso('Módulos','Gestionar',true);

        $respuesta = (array) $this->respuestasModel->find($respuesta_id);
        if ($respuesta==null) {
            die("No se encontró la respuesta");
        }

        if ($respuesta["usuario_id"]!=session()->get('usuario')["id"]) {
            die('No tiene permisos para visualizar esta solicitud');
        }
    
        $data['formulario'] = $this->formulariosModel->find($respuesta["formulario_id"]);
        $data["respuesta"] = $respuesta;
        $data["show_gestion_form"]=false;
        $data["gestiones"]= $this->respuestasGestionesModel->getByRespuestaId($respuesta_id);
        $data['usuarios']= $this->usuarioModel->findAll(); 
        return view('modulos/gestionar',$data);
    }

    public function gestionar($respuesta_id=null){
        helper('formulario');
        helper('respuesta');
        permiso('Módulos','Gestionar',true);

        $respuesta = (array) $this->respuestasModel->find($respuesta_id);
        if ($respuesta==null) {
            die("No se encontró la respuesta");
        }

        if ($respuesta["usuario_asignado_id"]!=session()->get('usuario')["id"]) {
            if ($respuesta["perfil_asignado_id"]!=session()->get('usuario')["perfil_id"]) {
                   die('No tiene permisos para gestionar esta solicitud');
            }
        }
    
        $data['formulario'] = $this->formulariosModel->find($respuesta["formulario_id"]);
        $data["respuesta"] = $respuesta;
        $data["gestiones"]= $this->respuestasGestionesModel->getByRespuestaId($respuesta_id);
        $data['usuarios']= $this->usuarioModel->findAll(); 
        return view('modulos/gestionar',$data);
    }

    private function procesarArchivos(array $archivos): ?string
    {
        $uploadPath = FCPATH . 'uploads/';
        $permitidos = [
            'jpg','jpeg','png','pdf','doc','docx','xls','xlsx','txt'
        ];

        $resultado = [];

        foreach ($archivos as $file) {

            if (!$file->isValid() || $file->hasMoved()) {
                continue;
            }

            $extension = strtolower($file->getExtension());

            // ❌ Bloquear extensiones peligrosas
            if (!in_array($extension, $permitidos)) {
                continue;
            }

            $nuevoNombre = uniqid('file_') . '.' . $extension;

            $file->move($uploadPath, $nuevoNombre);

            $resultado[] = [
                'nombre_guardado'  => $nuevoNombre,
                'nombre_original'  => $file->getClientName(),
                'extension'        => $extension,
                'mime'             => $file->getClientMimeType(),
                'size'             => $file->getSize(),
            ];
        }

        return empty($resultado) ? null : json_encode($resultado, JSON_UNESCAPED_UNICODE);
    }


    public function registrar_gestion(){
        if (!permiso('Módulos','Gestionar')) {
            return $this->response->setJSON([
                "success" => false,
                "message" => "No tienes permitido registrar gestiones"
            ]);
        }
        

       
        //$data = $this->request->getPost();
        $tipo_gestion=$this->request->getPost('tipo');
        $respuesta_id=$this->request->getPost('respuesta_id');
        $usuario_asignado_id=$this->request->getPost('usuario_asignado_id');
        $estado=$this->request->getPost('estado');
        //CREAR GESTIÓN 

        $respuesta = (array) $this->respuestasModel->find($respuesta_id);
        if ($respuesta==null) {
            return $this->response->setJSON([
                "success" => false,
                "message" => "No se encontró la respuesta indicada"
            ]);
        }

        if ($respuesta["usuario_asignado_id"]!=session()->get('usuario')["id"]) {
            if ($respuesta["perfil_asignado_id"]!=session()->get('usuario')["perfil_id"]) {
                   die('No tiene permisos para gestionar esta solicitud');
            }
        }
    
        $form = $this->formulariosModel->find($respuesta["formulario_id"]);

        $files = $this->request->getFiles();
        $archivos_json = null;

        if (isset($files['archivos'])) {
            $archivos_json = $this->procesarArchivos($files['archivos']);
        }

       
        $gestion=[
                "respuesta_id"=>$respuesta_id,
                "estado_respuesta"=>$estado,
                "estado_gestion"=>"en proceso",
                "fecha_creacion"=>date('Y-m-d H:i:s'),
                "usuario_creador_id"=>session()->get('usuario')["id"],
                "usuario_asignado_id"=>$usuario_asignado_id,
                "tipo"=>$tipo_gestion,
                "archivos"=> $archivos_json,
                "comentarios"=>$this->request->getPost('comentarios')
            ]; 

        //archivos en JSON
        $this->respuestasGestionesModel->save($gestion);

        $dataUpdate = [
            "estado"=>$estado,
            "usuario_asignado_id"=>$usuario_asignado_id,
            "fecha_modificacion" => date('Y-m-d H:i:s'),
            "perfil_asignado_id"=>null //en el futuro agregar perfil
        ];

        $this->respuestasModel->update($respuesta_id, $dataUpdate);

        if ($tipo_gestion=='derivacion') {
            #enviar correo y notificación al nuevo usuario asignado
            $emailData = [
                'respuesta_id'      => $gestion['respuesta_id'],
                'tipo'              => $gestion['tipo'],
                'estado'            => $gestion['estado_respuesta'],
                'fecha_creacion'    => $gestion['fecha_creacion'],
                'usuario_creador'   => session()->get('usuario')["nombre"],   // string
                'usuario_asignado'  => get_user($usuario_asignado_id)["nombre"] ,  // string
                'comentarios'       => $gestion['comentarios'],
            ];
            $mensaje = view('email/gestion', $emailData);
            $para=get_user($usuario_asignado_id)["email"] ?? 'notfound@mail.com';
            sendEmail($para, 'Nueva solicitud '.$form["nombre"], $mensaje);

        }else{
            #enviar correo y notificación al usuario creador de la respuesta
             $emailData = [
                'respuesta_id'      => $gestion['respuesta_id'],
                'tipo'              => $gestion['tipo'],
                'estado'            => $gestion['estado_respuesta'],
                'fecha_creacion'    => $gestion['fecha_creacion'],
                'usuario_creador'   => session()->get('usuario')["nombre"],   // string
                'usuario_asignado'  => 'Ninguno',  // string
                'comentarios'       => $gestion['comentarios'],
            ];
            $mensaje = view('email/gestion', $emailData);
            $para=get_user($respuesta["usuario_id"])["email"] ?? 'notfound@mail.com';
            sendEmail($para, 'Nueva solicitud '.$form["nombre"], $mensaje);
            /*
            $notificacion=[
				"titulo"=>"Su solicitud para ".$form["nombre"]." ha sido actualizada a ".$gestion["estado_respuesta"],
				"enlace"=>site_url()."modulos/gestionar/".$respuesta["uniqid"],
				"cuerpo"=>'Se ha actualizado su solicitud con los siguientes comentarios:'.$gestion["comentarios"],
				"usuario_id"=>$usuario_asignado_id,
				"visto"=>0,
				"usuario_origen_id"=>session()->get('usuario')["id"]
			];
			nueva_notificacion($notificacion);*/
        }
       

        return $this->response->setJSON([
                'success' => true,
                'message' => 'Gestión registrada correctamente.',
                'data' => [
                    'gestion' => $gestion
                ]
            ]);
    }


}
