import jsPDF from 'jspdf';
import { formatMoney } from '@/utils/formatters';

/**
 * Servicio para generar cotizaciones en formato PDF desde el carrito
 */
const quoteService = {

    /**
     * Obtener información del negocio desde variables de entorno
     */
    getBusinessInfo() {
        return {
            name: import.meta.env.VITE_APP_NAME,
            city: import.meta.env.VITE_BUSINESS_CITY,
            state: import.meta.env.VITE_BUSINESS_STATE,
            country: import.meta.env.VITE_BUSINESS_COUNTRY,
            phone: import.meta.env.VITE_BUSINESS_PHONE || '',
        };
    },

    /**
     * Genera un folio de cotización único basado en fecha y hora
     */
    generateFolio() {
        const now = new Date();
        const pad = (n) => String(n).padStart(2, '0');
        return `COT-${now.getFullYear()}${pad(now.getMonth() + 1)}${pad(now.getDate())}-${pad(now.getHours())}${pad(now.getMinutes())}${pad(now.getSeconds())}`;
    },

    /**
     * Genera el PDF de cotización a partir de los items del carrito
     *
     * @param {Array}  cartItems          - Items del carrito (cart.items)
     * @param {Object} totals             - { subtotal, tax, total }
     * @param {Object} options
     * @param {string} options.businessName - Nombre del negocio (fallback a env)
     * @param {boolean} options.autoDownload - Descargar PDF automáticamente (default true)
     */
    async generate(cartItems, totals, options = {}) {
        const business = this.getBusinessInfo();
        const {
            businessName = business.name,
            autoDownload = true
        } = options;

        const folio = this.generateFolio();
        const now = new Date();

        const doc = new jsPDF({
            orientation: 'portrait',
            unit: 'mm',
            format: [80, 297]
        });

        let y = 10;
        const left = 5;
        const right = 75;
        const center = 40;

        const BLACK = [0, 0, 0];
        const DARK_GRAY = [80, 80, 80];
        const LIGHT_GRAY = [140, 140, 140];

        const line = (yPos, width = 0.3) => {
            doc.setLineWidth(width);
            doc.setDrawColor(...BLACK);
            doc.line(left, yPos, right, yPos);
        };

        // ===== ENCABEZADO =====
        doc.setFontSize(14);
        doc.setFont('helvetica', 'bold');
        doc.setTextColor(...BLACK);
        doc.text(businessName, center, y, { align: 'center' });
        y += 6;

        doc.setFontSize(8);
        doc.setFont('helvetica', 'normal');
        doc.setTextColor(...DARK_GRAY);
        doc.text(`${business.city}, ${business.state}, ${business.country}`, center, y, { align: 'center' });
        y += 4;
        doc.text(business.phone, center, y, { align: 'center' });
        y += 6;

        line(y);
        y += 5;

        // ===== TÍTULO =====
        doc.setFontSize(13);
        doc.setFont('helvetica', 'bold');
        doc.setTextColor(...BLACK);
        doc.text('COTIZACIÓN', center, y, { align: 'center' });
        y += 7;

        // ===== FOLIO Y FECHAS =====
        doc.setFontSize(8);
        doc.setFont('helvetica', 'normal');
        doc.setTextColor(...DARK_GRAY);

        doc.text(`Folio: ${folio}`, left, y);
        y += 4;

        const fmtDate = (d) => d.toLocaleDateString('es-MX', { year: 'numeric', month: 'long', day: 'numeric' });
        doc.text(`Fecha: ${fmtDate(now)}`, left, y);
        y += 4;

        line(y);
        y += 5;

        // ===== CABECERA DE TABLA =====
        doc.setFontSize(9);
        doc.setFont('helvetica', 'bold');
        doc.setTextColor(...BLACK);
        doc.text('ARTÍCULOS', center, y, { align: 'center' });
        y += 5;

        doc.setFontSize(7);
        doc.setFont('helvetica', 'bold');
        doc.setTextColor(...DARK_GRAY);
        doc.text('DESCRIPCIÓN', left, y);
        doc.text('CANT', 52, y, { align: 'center' });
        doc.text('P.UNIT', right, y, { align: 'right' });
        y += 4;

        line(y, 0.2);
        y += 4;

        // ===== ITEMS =====
        cartItems.forEach((item) => {
            const name = item.product_name || item.name || 'Producto';
            const nameLines = doc.splitTextToSize(name, 44);

            doc.setFontSize(8);
            doc.setFont('helvetica', 'bold');
            doc.setTextColor(...BLACK);
            doc.text(nameLines, left, y);
            y += nameLines.length * 3.5;

            if (item.sku) {
                doc.setFontSize(7);
                doc.setFont('helvetica', 'normal');
                doc.setTextColor(...DARK_GRAY);
                doc.text(`SKU: ${item.sku}`, left, y);
                y += 3;
            }

            const qty = item.quantity || 1;
            const unitPrice = item.unit_price || 0;

            doc.setFontSize(8);
            doc.setFont('helvetica', 'normal');
            doc.setTextColor(...BLACK);
            doc.text(String(qty), 52, y, { align: 'center' });
            doc.text(`$${formatMoney(unitPrice)}`, right, y, { align: 'right' });
            y += 6;
        });

        // ===== TOTALES =====
        line(y);
        y += 5;

        doc.setFontSize(9);
        doc.setFont('helvetica', 'normal');
        doc.setTextColor(...DARK_GRAY);

        doc.text('Subtotal:', left, y);
        doc.text(`$${formatMoney(totals.subtotal)}`, right, y, { align: 'right' });
        y += 5;

        doc.text('IVA (16%):', left, y);
        doc.text(`$${formatMoney(totals.tax)}`, right, y, { align: 'right' });
        y += 5;

        line(y, 0.4);
        y += 5;

        doc.setFontSize(12);
        doc.setFont('helvetica', 'bold');
        doc.setTextColor(...BLACK);
        doc.text('TOTAL:', left, y);
        doc.text(`$${formatMoney(totals.total)}`, right, y, { align: 'right' });
        y += 10;

        // ===== FOOTER =====
        line(y, 0.2);
        y += 5;

        doc.setFontSize(9);
        doc.setFont('helvetica', 'bold');
        doc.setTextColor(...BLACK);
        doc.text('¡Gracias por su preferencia!', center, y, { align: 'center' });
        y += 5;

        doc.setFontSize(7);
        doc.setFont('helvetica', 'normal');
        doc.setTextColor(...LIGHT_GRAY);
        doc.text('Esta cotización no constituye una venta.', center, y, { align: 'center' });
        y += 3;

        if (autoDownload) {
            doc.save(`${folio}.pdf`);
        }

        return doc;
    }
};

export default quoteService;
