<?php
/**
 * Modelo Empresa
 * Gestiona las empresas proveedoras de JW DIESEL
 */
class Empresa
{
    private PDO $db;

    public function __construct()
    {
        $this->db = Conexion::getConexion();
    }

    /**
     * Obtener todas las empresas activas
     */
    public function getAll(): array
    {
        $sql = "SELECT * FROM empresas WHERE estado = 1 ORDER BY razon_social ASC";
        $stmt = $this->db->query($sql);
        return $stmt->fetchAll();
    }

    /**
     * Obtener todas las empresas (incluyendo inactivas)
     */
    public function getAllWithInactive(): array
    {
        $sql = "SELECT * FROM empresas ORDER BY estado DESC, razon_social ASC";
        $stmt = $this->db->query($sql);
        return $stmt->fetchAll();
    }

    /**
     * Obtener empresa por ID
     */
    public function getById(int $id): ?array
    {
        $sql = "SELECT * FROM empresas WHERE id = :id";
        $stmt = $this->db->prepare($sql);
        $stmt->execute([':id' => $id]);
        $result = $stmt->fetch();
        return $result ?: null;
    }

    /**
     * Crear nueva empresa
     */
    public function create(array $data): int
    {
        $sql = "INSERT INTO empresas (razon_social, ruc, direccion, telefono, contacto, email) 
                VALUES (:razon_social, :ruc, :direccion, :telefono, :contacto, :email)";
        $stmt = $this->db->prepare($sql);
        $stmt->execute([
            ':razon_social' => $data['razon_social'],
            ':ruc'          => $data['ruc'] ?? null,
            ':direccion'    => $data['direccion'] ?? null,
            ':telefono'     => $data['telefono'] ?? null,
            ':contacto'     => $data['contacto'] ?? null,
            ':email'        => $data['email'] ?? null,
        ]);
        return (int)$this->db->lastInsertId();
    }

    /**
     * Actualizar empresa
     */
    public function update(int $id, array $data): bool
    {
        $sql = "UPDATE empresas SET 
                razon_social = :razon_social, 
                ruc = :ruc, 
                direccion = :direccion, 
                telefono = :telefono, 
                contacto = :contacto, 
                email = :email 
                WHERE id = :id";
        $stmt = $this->db->prepare($sql);
        return $stmt->execute([
            ':razon_social' => $data['razon_social'],
            ':ruc'          => $data['ruc'] ?? null,
            ':direccion'    => $data['direccion'] ?? null,
            ':telefono'     => $data['telefono'] ?? null,
            ':contacto'     => $data['contacto'] ?? null,
            ':email'        => $data['email'] ?? null,
            ':id'           => $id,
        ]);
    }

    /**
     * Cambiar estado de empresa (activar/desactivar)
     */
    public function toggleEstado(int $id): bool
    {
        $sql = "UPDATE empresas SET estado = IF(estado = 1, 0, 1) WHERE id = :id";
        $stmt = $this->db->prepare($sql);
        return $stmt->execute([':id' => $id]);
    }

    /**
     * Contar empresas activas
     */
    public function countActivas(): int
    {
        $sql = "SELECT COUNT(*) as total FROM empresas WHERE estado = 1";
        $stmt = $this->db->query($sql);
        return (int)$stmt->fetch()['total'];
    }

    /**
     * Obtener empresas con conteo de letras pendientes
     */
    public function getWithLetrasPendientes(): array
    {
        $sql = "SELECT e.*, 
                COUNT(l.id) as total_letras,
                SUM(CASE WHEN l.estado = 'pendiente' THEN 1 ELSE 0 END) as letras_pendientes,
                SUM(CASE WHEN l.estado = 'pendiente' THEN l.importe ELSE 0 END) as monto_pendiente
                FROM empresas e
                LEFT JOIN letras l ON e.id = l.empresa_id
                WHERE e.estado = 1
                GROUP BY e.id
                ORDER BY e.razon_social ASC";
        $stmt = $this->db->query($sql);
        return $stmt->fetchAll();
    }

    /**
     * Verificar si un RUC ya existe en la base de datos
     * @param string $ruc RUC a verificar
     * @param int|null $excludeId ID a excluir (para edición)
     * @return bool true si el RUC ya existe
     */
    public function existeRuc(string $ruc, ?int $excludeId = null): bool
    {
        if (empty($ruc)) return false;

        $sql = "SELECT COUNT(*) as total FROM empresas WHERE ruc = :ruc";
        $params = [':ruc' => $ruc];

        if ($excludeId !== null) {
            $sql .= " AND id != :id";
            $params[':id'] = $excludeId;
        }

        $stmt = $this->db->prepare($sql);
        $stmt->execute($params);
        return (int)$stmt->fetch()['total'] > 0;
    }

    /**
     * Obtener todas las empresas (activas e inactivas) con estadísticas de letras
     * Optimizado para uso con DataTables
     */
    public function getWithLetrasStats(): array
    {
        $sql = "SELECT e.*, 
                COUNT(l.id) as total_letras,
                SUM(CASE WHEN l.estado = 'pendiente' THEN 1 ELSE 0 END) as letras_pendientes,
                SUM(CASE WHEN l.estado = 'pagada' THEN 1 ELSE 0 END) as letras_pagadas,
                SUM(CASE WHEN l.estado = 'pendiente' THEN l.importe ELSE 0 END) as monto_pendiente,
                SUM(CASE WHEN l.estado = 'pagada' THEN l.importe ELSE 0 END) as monto_pagado
                FROM empresas e
                LEFT JOIN letras l ON e.id = l.empresa_id
                GROUP BY e.id
                ORDER BY e.estado DESC, e.razon_social ASC";
        $stmt = $this->db->query($sql);
        return $stmt->fetchAll();
    }

    /**
     * Verificar si una empresa tiene letras asociadas
     */
    public function tieneLetras(int $id): bool
    {
        $sql = "SELECT COUNT(*) as total FROM letras WHERE empresa_id = :id";
        $stmt = $this->db->prepare($sql);
        $stmt->execute([':id' => $id]);
        return (int)$stmt->fetch()['total'] > 0;
    }

    /**
     * Eliminar empresa permanentemente
     */
    public function delete(int $id): bool
    {
        $sql = "DELETE FROM empresas WHERE id = :id";
        $stmt = $this->db->prepare($sql);
        return $stmt->execute([':id' => $id]);
    }
}
