<?php
/**
 * Modelo GrupoLetra
 * Gestiona los grupos/lotes de letras (cada factura canjeada)
 */
class GrupoLetra
{
    private PDO $db;

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

    /**
     * Obtener todos los grupos con info de empresa
     */
    public function getAll(): array
    {
        $sql = "SELECT g.*, e.razon_social 
                FROM grupos_letras g
                INNER JOIN empresas e ON g.empresa_id = e.id
                ORDER BY g.created_at DESC";
        $stmt = $this->db->query($sql);
        return $stmt->fetchAll();
    }

    /**
     * Obtener grupo por ID
     */
    public function getById(int $id): ?array
    {
        $sql = "SELECT g.*, e.razon_social 
                FROM grupos_letras g
                INNER JOIN empresas e ON g.empresa_id = e.id
                WHERE g.id = :id";
        $stmt = $this->db->prepare($sql);
        $stmt->execute([':id' => $id]);
        $result = $stmt->fetch();
        return $result ?: null;
    }

    /**
     * Crear grupo con sus letras (transacción)
     * 
     * @param array $grupoData Datos del grupo
     * @param array $letrasData Array de arrays con datos de cada letra
     * @return int ID del grupo creado
     */
    public function crearConLetras(array $grupoData, array $letrasData): int
    {
        $this->db->beginTransaction();

        try {
            // Insertar grupo
            $sql = "INSERT INTO grupos_letras 
                    (empresa_id, serie, documento_sunat, fecha_emision_factura, moneda, importe_factura, total_letras, cantidad_letras, observaciones) 
                    VALUES 
                    (:empresa_id, :serie, :documento_sunat, :fecha_emision_factura, :moneda, :importe_factura, :total_letras, :cantidad_letras, :observaciones)";
            
            $stmt = $this->db->prepare($sql);
            $stmt->execute([
                ':empresa_id'           => $grupoData['empresa_id'],
                ':serie'                => $grupoData['serie'] ?? '001',
                ':documento_sunat'      => $grupoData['documento_sunat'] ?? null,
                ':fecha_emision_factura' => $grupoData['fecha_emision_factura'] ?? null,
                ':moneda'               => $grupoData['moneda'] ?? 'USD',
                ':importe_factura'      => $grupoData['importe_factura'] ?? 0,
                ':total_letras'         => $grupoData['total_letras'] ?? 0,
                ':cantidad_letras'      => count($letrasData),
                ':observaciones'        => $grupoData['observaciones'] ?? null,
            ]);

            $grupoId = (int)$this->db->lastInsertId();

            // Insertar letras
            $sqlLetra = "INSERT INTO letras 
                        (grupo_id, empresa_id, numero_letra, numero_en_grupo, renovacion, tipo_letra, moneda, fecha_emision, plazo_dias, fecha_vencimiento, importe, banco, estado, referencia_unica, observaciones) 
                        VALUES 
                        (:grupo_id, :empresa_id, :numero_letra, :numero_en_grupo, :renovacion, :tipo_letra, :moneda, :fecha_emision, :plazo_dias, :fecha_vencimiento, :importe, :banco, :estado, :referencia_unica, :observaciones)";
            
            $stmtLetra = $this->db->prepare($sqlLetra);

            foreach ($letrasData as $index => $letra) {
                $stmtLetra->execute([
                    ':grupo_id'          => $grupoId,
                    ':empresa_id'        => $grupoData['empresa_id'],
                    ':numero_letra'      => $letra['numero_letra'],
                    ':numero_en_grupo'   => $index + 1,
                    ':renovacion'        => $letra['renovacion'] ?? 0,
                    ':tipo_letra'        => $letra['tipo_letra'] ?? 'ORI',
                    ':moneda'            => $letra['moneda'] ?? $grupoData['moneda'] ?? 'USD',
                    ':fecha_emision'     => $letra['fecha_emision'],
                    ':plazo_dias'        => $letra['plazo_dias'] ?? 30,
                    ':fecha_vencimiento' => $letra['fecha_vencimiento'],
                    ':importe'           => $letra['importe'],
                    ':banco'             => $letra['banco'] ?? null,
                    ':estado'            => 'pendiente',
                    ':referencia_unica'  => $letra['referencia_unica'] ?? null,
                    ':observaciones'     => $letra['observaciones'] ?? null,
                ]);
            }

            $this->db->commit();
            return $grupoId;

        } catch (\Exception $e) {
            $this->db->rollBack();
            throw $e;
        }
    }

    /**
     * Eliminar grupo y sus letras
     */
    public function delete(int $id): bool
    {
        // Las letras se eliminan en cascada por FK
        $sql = "DELETE FROM grupos_letras WHERE id = :id";
        $stmt = $this->db->prepare($sql);
        return $stmt->execute([':id' => $id]);
    }
}
