const fs = require("fs");
const jwt = require("jsonwebtoken");
const si = require("systeminformation");
const crypto = require("crypto");
const axios = require('axios');

// Functie pentru a genera hash-ul unic al dispozitivului
const genereazaHashUnic = async () => {
  try {
    // Folosește axios pentru a trimite cererea GET
    const response = await axios.get('http://localhost:5000/api/licenta/device-id');
    return response.data.deviceId; // Returnează deviceId-ul din API
  } catch (error) {
    console.error("Eroare la obținerea deviceId-ului:", error);
    return null;
  }
};

// Functie pentru a obține informațiile despre firmă
const getFirma = async () => {
  try {
    const response = await axios.get('http://localhost:5000/api/firma/select_firma');
    return response.data && response.data.length > 0 ? response.data[0] : null;
  } catch (error) {
    console.error("Eroare la obținerea informațiilor despre firmă:", error);
    return null;
  }
};

// Middleware pentru validarea licenței
async function verificaLicenta(req, res, next) {
  try {
    const token = fs.readFileSync("./licenta.jwt", "utf8");
    const publicKey = fs.readFileSync("./public.key", "utf8");
    const deviceId = await genereazaHashUnic();
    const firma = await getFirma();

    if (!firma) {
      return res.status(500).json({ message: "Nu s-au găsit informații despre firmă." });
    }

    // Verificare token JWT
    const decoded = jwt.verify(token, publicKey, { algorithms: ["RS256"] });

    // Validare device_id
    if (decoded.device_id !== deviceId) {
      return res.status(403).json({ message: "Licența nu este validă pentru acest dispozitiv." });
    }

    // Verificare denumire și cui
    if (decoded.denumire !== firma.denumire || decoded.cui !== firma.cui) {
      return res.status(403).json({ message: "Licența nu este validă pentru această firmă." });
    }

    // Verificare expirare token
    const endDate = new Date(decoded.end_date);
    if (new Date() > endDate) {
      return res.status(403).json({ message: "Licența a expirat." });
    }

    console.log("Licența este validă.");
    next(); // Permite continuarea cererii către ruta dorită
  } catch (err) {
    console.error("Eroare validare licență:", err.message);
    res.status(403).json({ message: "Licență invalidă sau inexistentă." });
  }
}

module.exports = verificaLicenta;
