<?php
/**
 * Controlador de Empresas
 * CRUD de empresas proveedoras
 */
class EmpresaController
{
    private Empresa $empresaModel;
    private Letra $letraModel;

    public function __construct()
    {
        $this->empresaModel = new Empresa();
        $this->letraModel   = new Letra();
    }

    /**
     * Listado de empresas con DataTables
     */
    public function index(): void
    {
        $empresas = $this->empresaModel->getWithLetrasStats();

        // Alertas
        $alertas   = $this->letraModel->getAlertasVencimiento();
        $excedidas = $this->letraModel->getLetrasExcedidas();

        $pageTitle   = 'Empresas Proveedoras';
        $currentPage = 'empresas';

        loadView('layout/header', compact('pageTitle', 'currentPage'));
        loadView('layout/sidebar', compact('currentPage'));
        loadView('empresas/index', compact('empresas'));
        loadView('layout/footer', compact('currentPage', 'alertas', 'excedidas'));
    }

    /**
     * Formulario crear empresa
     */
    public function crear(): void
    {
        $empresa = null;

        // Alertas
        $alertas   = $this->letraModel->getAlertasVencimiento();
        $excedidas = $this->letraModel->getLetrasExcedidas();

        $pageTitle   = 'Nueva Empresa';
        $currentPage = 'empresas';

        loadView('layout/header', compact('pageTitle', 'currentPage'));
        loadView('layout/sidebar', compact('currentPage'));
        loadView('empresas/form', compact('empresa'));
        loadView('layout/footer', compact('currentPage', 'alertas', 'excedidas'));
    }

    /**
     * Guardar nueva empresa (POST)
     */
    public function guardar(): void
    {
        if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
            redirect('?c=empresas&a=crear');
            return;
        }

        try {
            $data = [
                'razon_social' => trim($_POST['razon_social']),
                'ruc'          => trim($_POST['ruc'] ?? ''),
                'direccion'    => trim($_POST['direccion'] ?? ''),
                'telefono'     => trim($_POST['telefono'] ?? ''),
                'contacto'     => trim($_POST['contacto'] ?? ''),
                'email'        => trim($_POST['email'] ?? ''),
            ];

            if (empty($data['razon_social'])) {
                setFlash('error', 'La razón social es obligatoria.');
                redirect('?c=empresas&a=crear');
                return;
            }

            // Validar RUC duplicado
            if (!empty($data['ruc']) && $this->empresaModel->existeRuc($data['ruc'])) {
                setFlash('error', 'Ya existe una empresa registrada con el RUC ' . htmlspecialchars($data['ruc']) . '. No se puede duplicar.');
                redirect('?c=empresas&a=crear');
                return;
            }

            $this->empresaModel->create($data);
            setFlash('success', 'Empresa creada correctamente.');
            redirect('?c=empresas');

        } catch (\Exception $e) {
            setFlash('error', 'Error al crear empresa: ' . $e->getMessage());
            redirect('?c=empresas&a=crear');
        }
    }

    /**
     * Formulario editar empresa
     */
    public function editar(): void
    {
        $id = isset($_GET['id']) ? (int)$_GET['id'] : 0;
        $empresa = $this->empresaModel->getById($id);

        if (!$empresa) {
            setFlash('error', 'Empresa no encontrada.');
            redirect('?c=empresas');
            return;
        }

        // Alertas
        $alertas   = $this->letraModel->getAlertasVencimiento();
        $excedidas = $this->letraModel->getLetrasExcedidas();

        $pageTitle   = 'Editar Empresa';
        $currentPage = 'empresas';

        loadView('layout/header', compact('pageTitle', 'currentPage'));
        loadView('layout/sidebar', compact('currentPage'));
        loadView('empresas/form', compact('empresa'));
        loadView('layout/footer', compact('currentPage', 'alertas', 'excedidas'));
    }

    /**
     * Actualizar empresa (POST)
     */
    public function actualizar(): void
    {
        if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
            redirect('?c=empresas');
            return;
        }

        $id = (int)$_POST['id'];

        try {
            $data = [
                'razon_social' => trim($_POST['razon_social']),
                'ruc'          => trim($_POST['ruc'] ?? ''),
                'direccion'    => trim($_POST['direccion'] ?? ''),
                'telefono'     => trim($_POST['telefono'] ?? ''),
                'contacto'     => trim($_POST['contacto'] ?? ''),
                'email'        => trim($_POST['email'] ?? ''),
            ];

            // Validar RUC duplicado (excluyendo esta empresa)
            if (!empty($data['ruc']) && $this->empresaModel->existeRuc($data['ruc'], $id)) {
                setFlash('error', 'Ya existe otra empresa registrada con el RUC ' . htmlspecialchars($data['ruc']) . '.');
                redirect('?c=empresas&a=editar&id=' . $id);
                return;
            }

            $this->empresaModel->update($id, $data);
            setFlash('success', 'Empresa actualizada correctamente.');
        } catch (\Exception $e) {
            setFlash('error', 'Error al actualizar: ' . $e->getMessage());
        }

        redirect('?c=empresas');
    }

    /**
     * Activar/Desactivar empresa (AJAX - JSON response)
     */
    public function eliminar(): void
    {
        if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
            // Si no es AJAX, redirigir
            redirect('?c=empresas');
            return;
        }

        // Detectar si es una petición AJAX
        $isAjax = !empty($_SERVER['HTTP_X_REQUESTED_WITH']) && 
                  strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest';

        $id = (int)($_POST['id'] ?? 0);

        try {
            $empresa = $this->empresaModel->getById($id);
            if (!$empresa) {
                throw new \Exception('Empresa no encontrada.');
            }

            $this->empresaModel->toggleEstado($id);
            $nuevoEstado = $empresa['estado'] ? 0 : 1;

            if ($isAjax) {
                header('Content-Type: application/json');
                echo json_encode([
                    'success' => true,
                    'mensaje' => $nuevoEstado ? 'Empresa activada correctamente.' : 'Empresa desactivada correctamente.',
                    'nuevo_estado' => $nuevoEstado,
                ]);
                exit;
            }

            setFlash('success', 'Estado de empresa actualizado.');
        } catch (\Exception $e) {
            if ($isAjax) {
                header('Content-Type: application/json');
                echo json_encode([
                    'success' => false,
                    'mensaje' => 'Error: ' . $e->getMessage(),
                ]);
                exit;
            }

            setFlash('error', 'Error: ' . $e->getMessage());
        }

        redirect('?c=empresas');
    }

    /**
     * Guardar empresa vía AJAX (modal) - Retorna JSON
     */
    public function guardarajax(): void
    {
        header('Content-Type: application/json');

        if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
            echo json_encode(['success' => false, 'mensaje' => 'Método no permitido.']);
            exit;
        }

        try {
            $data = [
                'razon_social' => trim($_POST['razon_social'] ?? ''),
                'ruc'          => trim($_POST['ruc'] ?? ''),
                'direccion'    => trim($_POST['direccion'] ?? ''),
                'telefono'     => trim($_POST['telefono'] ?? ''),
                'contacto'     => trim($_POST['contacto'] ?? ''),
                'email'        => trim($_POST['email'] ?? ''),
            ];

            if (empty($data['razon_social'])) {
                echo json_encode(['success' => false, 'mensaje' => 'La razón social es obligatoria.']);
                exit;
            }

            if (empty($data['ruc'])) {
                echo json_encode(['success' => false, 'mensaje' => 'El RUC es obligatorio.']);
                exit;
            }

            if (!preg_match('/^\d{11}$/', $data['ruc'])) {
                echo json_encode(['success' => false, 'mensaje' => 'El RUC debe tener exactamente 11 dígitos numéricos.']);
                exit;
            }

            // Validar RUC duplicado
            if ($this->empresaModel->existeRuc($data['ruc'])) {
                echo json_encode([
                    'success' => false, 
                    'mensaje' => 'Ya existe una empresa registrada con el RUC ' . $data['ruc'] . '. No se puede duplicar.'
                ]);
                exit;
            }

            $id = $this->empresaModel->create($data);

            echo json_encode([
                'success' => true,
                'mensaje' => 'Empresa "' . $data['razon_social'] . '" creada correctamente.',
                'empresa' => [
                    'id'           => $id,
                    'razon_social' => $data['razon_social'],
                    'ruc'          => $data['ruc'],
                    'direccion'    => $data['direccion'],
                    'telefono'     => $data['telefono'],
                    'contacto'     => $data['contacto'],
                    'email'        => $data['email'],
                ]
            ]);
        } catch (\Exception $e) {
            echo json_encode(['success' => false, 'mensaje' => 'Error: ' . $e->getMessage()]);
        }
        exit;
    }

    /**
     * Eliminar empresa permanentemente (AJAX - JSON response)
     * Solo permite eliminar si no tiene letras asociadas
     */
    public function borrar(): void
    {
        header('Content-Type: application/json');

        if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
            echo json_encode(['success' => false, 'mensaje' => 'Método no permitido.']);
            exit;
        }

        $id = (int)($_POST['id'] ?? 0);

        try {
            $empresa = $this->empresaModel->getById($id);
            if (!$empresa) {
                throw new \Exception('Empresa no encontrada.');
            }

            // Verificar que no tenga letras asociadas
            if ($this->empresaModel->tieneLetras($id)) {
                echo json_encode([
                    'success' => false,
                    'mensaje' => 'No se puede eliminar la empresa porque tiene letras asociadas. Desactívela en su lugar.'
                ]);
                exit;
            }

            $this->empresaModel->delete($id);

            echo json_encode([
                'success' => true,
                'mensaje' => 'Empresa "' . $empresa['razon_social'] . '" eliminada permanentemente.',
            ]);
        } catch (\Exception $e) {
            echo json_encode([
                'success' => false,
                'mensaje' => 'Error: ' . $e->getMessage(),
            ]);
        }
        exit;
    }
}
