<?php

namespace App\Controllers;

use App\Models\UsuarioModel;
use App\Models\PostulanteModel;
use App\Models\EmpresaModel;
use App\Models\UsuarioTipoModel;

use CodeIgniter\RESTful\ResourceController;

class Usuarios extends ResourceController
{
    protected $format = 'json';

    // -------------------------------------------------------
    // POST /api/usuarios/registro
    // Registro de postulante o empresa
    // -------------------------------------------------------
    public function registro()
    {
        $usuarioModel      = new UsuarioModel();
        $postulanteModel   = new PostulanteModel();
        $empresaModel      = new EmpresaModel();
        $usuarioTipoModel  = new UsuarioTipoModel();

        $data = $this->request->getJSON(true);

        // ---------------------------------------------------
        // VALIDACIONES BÁSICAS
        // ---------------------------------------------------
        if (
            empty($data['nombre']) ||
            empty($data['email']) ||
            empty($data['password']) ||
            empty($data['tipo_id'])
        ) {
            return $this->fail('nombre, email, password y tipo_id son obligatorios', 400);
        }

        // ---------------------------------------------------
        // VERIFICAR EMAIL
        // ---------------------------------------------------
        if ($usuarioModel->buscarPorEmail($data['email'])) {
            return $this->fail('El email ya está registrado', 409);
        }

        // ---------------------------------------------------
        // INSERTAR EN USUARIOS
        // ---------------------------------------------------
        $usuarioData = [
            'nombre'   => $data['nombre'],
            'email'    => $data['email'],
            'password' => password_hash($data['password'], PASSWORD_BCRYPT)
        ];

        $usuarioId = $usuarioModel->insert($usuarioData);

        if (!$usuarioId) {
            return $this->respond([
                'error' => 'Error al crear usuario',
                'detalle' => $usuarioModel->errors()
            ], 500);
        }

        // ---------------------------------------------------
        // INSERTAR TIPO DE USUARIO
        // ---------------------------------------------------
        $usuarioTipoModel->insert([
            'usuarios_id'      => $usuarioId,
            'tipos_usuario_id' => $data['tipo_id']
        ]);

        // ---------------------------------------------------
        // REGISTRO POSTULANTE
        // tipo_id = 1
        // ---------------------------------------------------
        if ($data['tipo_id'] == 1) {

            $postulanteData = [
                'usuarios_id' => $usuarioId,
                'direccion'   => $data['direccion'] ?? null,
                'profesion'   => $data['profesion'] ?? null
            ];

            $postulanteId = $postulanteModel->insert($postulanteData);

            if (!$postulanteId) {
                return $this->respond([
                    'error' => 'Error al crear postulante',
                    'detalle' => $postulanteModel->errors()
                ], 500);
            }
        }

        // ---------------------------------------------------
        // REGISTRO EMPRESA
        // tipo_id = 2
        // ---------------------------------------------------
        if ($data['tipo_id'] == 2) {

            $empresaData = [
                'usuarios_id'   => $usuarioId,
                'nombre_empresa'=> $data['nombre_empresa'] ?? $data['nombre'],
                'ubicacion'     => $data['ubicacion'] ?? null,
                'sitio_web'     => $data['sitio_web'] ?? null
            ];

            $empresaId = $empresaModel->insert($empresaData);

            if (!$empresaId) {
                return $this->respond([
                    'error' => 'Error al crear empresa',
                    'detalle' => $empresaModel->errors()
                ], 500);
            }
        }

        // ---------------------------------------------------
        // RESPUESTA FINAL
        // ---------------------------------------------------
        return $this->respondCreated([
            'mensaje'   => 'Usuario registrado correctamente',
            'usuario_id'=> $usuarioId
        ]);
    }

    // -------------------------------------------------------
    // LOGIN
    // POST /api/usuarios/login
    // -------------------------------------------------------
    public function login()
    {
        $model = new UsuarioModel();

        $data = $this->request->getJSON(true);

        if (empty($data['email']) || empty($data['password'])) {
            return $this->fail('email y password son obligatorios', 400);
        }

        // Buscar usuario
        $usuario = $model->buscarPorEmail($data['email']);

        if (!$usuario) {
            return $this->fail('Credenciales incorrectas', 401);
        }

        // Verificar password
        if (!password_verify($data['password'], $usuario['password'])) {
            return $this->fail('Credenciales incorrectas', 401);
        }

        // Obtener tipo usuario
        $db = \Config\Database::connect();

        $tipo = $db->table('usuario_tipo')
            ->select('tipos_usuario.nombre')
            ->join('tipos_usuario', 'tipos_usuario.id = usuario_tipo.tipos_usuario_id')
            ->where('usuario_tipo.usuarios_id', $usuario['id'])
            ->get()
            ->getRowArray();

        unset($usuario['password']);

        $usuario['tipo'] = $tipo['nombre'] ?? 'usuario';

        return $this->respond([
            'mensaje' => 'Login exitoso',
            'usuario' => $usuario
        ]);
    }

    // -------------------------------------------------------
    // GET /api/usuarios
    // -------------------------------------------------------
    public function index()
    {
        $model = new UsuarioModel();

        $usuarios = $model->findAll();

        foreach ($usuarios as &$u) {
            unset($u['password']);
        }

        return $this->respond($usuarios);
    }

    // -------------------------------------------------------
    // GET /api/usuarios/{id}
    // -------------------------------------------------------
    public function show($id = null)
    {
        $model = new UsuarioModel();

        $usuario = $model->find($id);

        if (!$usuario) {
            return $this->failNotFound('Usuario no encontrado');
        }

        unset($usuario['password']);

        return $this->respond($usuario);
    }

    // -------------------------------------------------------
    // PUT /api/usuarios/{id}
    // -------------------------------------------------------
    public function update($id = null)
    {
        $model = new UsuarioModel();

        $usuario = $model->find($id);

        if (!$usuario) {
            return $this->failNotFound('Usuario no encontrado');
        }

        $data = $this->request->getJSON(true);

        if (!empty($data['password'])) {
            $data['password'] = password_hash($data['password'], PASSWORD_BCRYPT);
        }

        $model->update($id, $data);

        return $this->respond([
            'mensaje' => 'Usuario actualizado correctamente'
        ]);
    }

    // -------------------------------------------------------
    // DELETE /api/usuarios/{id}
    // -------------------------------------------------------
    public function delete($id = null)
    {
        $model = new UsuarioModel();

        $usuario = $model->find($id);

        if (!$usuario) {
            return $this->failNotFound('Usuario no encontrado');
        }

        $model->delete($id);

        return $this->respond([
            'mensaje' => 'Usuario eliminado correctamente'
        ]);
    }
}