const express = require('express');
const fs = require('fs');
const path = require('path');
const { execFile } = require('child_process');
const cors = require('cors');

const router = express.Router();
const RECEIPT_DIR = path.join(__dirname, 'bonuri');
const CMD_PATH = path.join(__dirname, 'datecs', 'dude-cmd.exe');

router.use(express.json());
router.use(cors()); // Permite cereri de la orice IP

function runDudeCmdWithInputFile(inputFilePath, callback) {
    const command = [
        "--rs232", 
        "--rs232-port", "1",
        "--rs232-baud", "115200",
        "--input", inputFilePath,
        "--language", "ro"
    ];

    console.log(`Executing: ${CMD_PATH} ${command.join(" ")}`);

    execFile(CMD_PATH, command, (error, stdout, stderr) => {
        if (error) {
            console.error("ERROR executing dude-cmd.exe");
            console.error("Exit Code:", error.code);
            console.error("STDOUT:", stdout.trim());
            console.error("STDERR:", stderr.trim());

            let errorMessage = "Eroare la procesarea comenzii.";

            if (stdout.includes("Timeout expired. (-6)")) {
                errorMessage = "Casa de marcat nu răspunde. Verificați conexiunea.";
            } else if (stdout.includes("-100403")) {  // Verificăm eroarea -100403
                errorMessage = "Lipsa hartie";
            } else if (stdout.includes("-100404")) {  // Verificăm eroarea -100403
                errorMessage = "Capac Deschis";
            } else if (stdout.includes("-100405")) {  // Verificăm eroarea -100403
                errorMessage = "Atentie! Se termina hartia";
            } else if (stdout.includes("-110811")) {  // Verificăm eroarea -100403
                errorMessage = "S-au depasit 24 ore de la deschiderea turei Emiteti un Raport Z";
            }

            return callback(false, errorMessage);
        }

        console.log("Command executed successfully!");
        console.log("STDOUT:", stdout.trim());
        console.log("STDERR:", stderr.trim());

        callback(true, "Raport generat cu succes.");
    });
}

router.post('/print-receipt', (req, res) => {
    console.log("Received request on /print-receipt");
    const data = req.body;

    if (!data || !Array.isArray(data.products) || data.products.length === 0) {
        return res.status(400).json({ status: "error", message: "No products provided" });
    }

    const modIncasare = Array.isArray(data.mod_incasare) ? data.mod_incasare : [];
    const cuiBon = data.CuiBon || {};
    const cuiText = cuiBon.cuitext || '';
    const cuiClient = cuiBon.cuiclient || '';
    const username = data.username || 'VANZATOR';

    let commands = [];
    let totalValue = 0;

    // Adăugăm CF^cuiclient la început dacă există cuiClient
    if (cuiClient) {
        commands.push(`CF^${cuiClient}`);
    }

    data.products.forEach(product => {
        const productName = product.product_name?.slice(0, 30) || 'Product';
        const unitPrice = product.unit_price || 0;
        const quantity = product.quantity || 0;
        const unitOfMeasure = product.unit_of_measure || 'buc';
        const idCota = product.id_cota || 0;
        const vatRate = product.vat_rate || 0;

        // Conversii la centi și mili (x100 și x1000)
        const unitPriceInCenti = Math.round(unitPrice * 100);
        const quantityInMili = Math.round(quantity * 1000);

        const line = `S^${productName}^${unitPriceInCenti}^${quantityInMili}^${unitOfMeasure}^${idCota}^1`;
        commands.push(line);

        totalValue += quantity * unitPrice;
    });

    // Linie operator
    commands.push(`TL^Operator : ${username}`);

    // Metode de plată
    modIncasare.forEach(payment => {
        const idIncasare = payment.id_incasare;
        const valoareTotal = payment.valoare_total;

        if (idIncasare != null && valoareTotal != null) {
            const valoareInCenti = Math.round(valoareTotal * 100);
            commands.push(`P^${idIncasare}^${valoareInCenti}`);
        }
    });

    // Generare nume fișier unic
    const now = new Date();
    const timestamp = `${now.getFullYear()}${(now.getMonth()+1).toString().padStart(2,'0')}${now.getDate().toString().padStart(2,'0')}_${now.getHours().toString().padStart(2,'0')}${now.getMinutes().toString().padStart(2,'0')}${now.getSeconds().toString().padStart(2,'0')}`;
    const uniqueFilename = `bon_${timestamp}.txt`;
    const receiptPath = path.join(RECEIPT_DIR, uniqueFilename);

    // Asigură-te că directorul există
    if (!fs.existsSync(RECEIPT_DIR)) {
        fs.mkdirSync(RECEIPT_DIR, { recursive: true });
    }

    try {
        // Scrie comanda în fișier
        fs.writeFileSync(receiptPath, commands.join("\n") + "\n", 'utf8');
        
        console.log(`✅ Bon fiscal generat și salvat în: ${receiptPath}`);
        console.log(`📋 Comenzi generate: ${commands.length} linii`);
        console.log(`💰 Valoare totală: ${totalValue.toFixed(2)}`);
        
        return res.json({ 
            status: "success", 
            message: "Bon fiscal generat și salvat cu succes",
            commands: commands,
            totalValue: totalValue.toFixed(2),
            fileName: uniqueFilename,
            filePath: receiptPath,
            timestamp: timestamp
        });
        
    } catch (error) {
        console.error("Error writing file:", error);
        return res.status(500).json({ 
            status: "error", 
            message: "Failed to write receipt file",
            error: error.message 
        });
    }
});

router.post('/introducere', async (req, res) => {
    try {
        const { suma, actiune } = req.body;

        // Verificăm dacă `suma` și `actiune` sunt valide
        if (typeof suma !== 'number') {
            return res.status(400).json({ status: "error", message: "Invalid or missing 'suma'" });
        }
        if (![0, 1].includes(actiune)) {
            return res.status(400).json({ status: "error", message: "'actiune' must be 0 (introducere) or 1 (scoatere)" });
        }

        // Creăm comanda în formatul Python
        let command;
        let tipOperatie;
        if (actiune === 0) {
            command = `I^${Math.round(suma * 100)}`; // Introducere numerar
            tipOperatie = 'introducere';
        } else {
            command = `O^${Math.round(suma * 100)}`; // Scoatere numerar
            tipOperatie = 'scoatere';
        }

        // Creăm directorul dacă nu există
        if (!fs.existsSync(RECEIPT_DIR)) {
            fs.mkdirSync(RECEIPT_DIR, { recursive: true });
        }

        // Calea fișierului - la fel ca în Python (Operatie.txt)
        const receiptPath = path.join(RECEIPT_DIR, `Operatie.txt`);

        // Scriem fișierul
        try {
            fs.writeFileSync(receiptPath, command + "\n", 'utf8');
            console.log(`✅ Operație de ${tipOperatie} salvată în: ${receiptPath}`);
            console.log(`📄 Comanda generată: ${command}`);
            console.log(`💰 Suma: ${suma} (${Math.round(suma * 100)} cenți)`);
            
            return res.json({ 
                status: "success", 
                message: `Operația de ${tipOperatie} numerar a fost salvată`,
                command: command.trim(),
                tipOperatie: tipOperatie,
                suma: suma,
                filePath: receiptPath
            });
            
        } catch (error) {
            console.error("Error writing file:", error);
            return res.status(500).json({ 
                status: "error", 
                message: "Failed to write receipt file",
                error: error.message 
            });
        }

    } catch (error) {
        console.error("Unexpected error:", error);
        return res.status(500).json({ 
            status: "error", 
            message: "Internal server error",
            error: error.message 
        });
    }
});

router.post('/raport', async (req, res) => {
    try {
        const { suma, actiune, actiune2 } = req.body;

        // Validare suma (opțională)
        if (suma !== undefined && typeof suma !== 'number') {
            const errorMessage = "Invalid or missing 'suma'";
            console.log(" Error sent to frontend:", errorMessage);
            return res.status(400).json({ status: "error", message: errorMessage });
        }

        // Validare că cel puțin un parametru de acțiune este trimis
        if (!actiune && !actiune2) {
            const errorMessage = "Either 'actiune' or 'actiune2' must be provided";
            console.log(" Error sent to frontend:", errorMessage);
            return res.status(400).json({ status: "error", message: errorMessage });
        }

        let command = "";
        let raportTip = "";

        // Determină tipul de raport
        if (actiune) {
            command = "X^"; // Raport X
            raportTip = 'X';
        } else if (actiune2) {
            command = "Z^"; // Raport Z
            raportTip = 'Z';
        }

        // Asigură-te că directorul există
        if (!fs.existsSync(RECEIPT_DIR)) {
            fs.mkdirSync(RECEIPT_DIR, { recursive: true });
        }

        // Calea către fișierul bon.txt
        const receiptPath = path.join(RECEIPT_DIR, `bon.txt`);

        try {
            // Scrie comanda în fișier
            fs.writeFileSync(receiptPath, command + "\n", 'utf8');
            
            // FiscalNet va prelua fișierul și va procesa comanda
            console.log(`✅ Comanda pentru raportul ${raportTip} a fost salvată în: ${receiptPath}`);
            
            return res.json({ 
                status: "success", 
                message: `Comanda pentru raportul ${raportTip} a fost generată și salvată`,
                command: command.trim(),
                filePath: receiptPath
            });
            
        } catch (error) {
            const errorMessage = "Failed to write receipt file";
            console.log("❌ Error sent to frontend:", errorMessage);
            console.error("Error writing file:", error);
            return res.status(500).json({ status: "error", message: errorMessage });
        }

    } catch (error) {
        const errorMessage = "Internal server error";
        console.log("❌ Error sent to frontend:", errorMessage);
        console.error("Unexpected error:", error);
        return res.status(500).json({ status: "error", message: errorMessage }); 
    }
});
module.exports = router;
