require('dotenv').config();
const express = require('express');
const bodyParser = require('body-parser');
const ethers = require('ethers');
const bip39 = require('bip39');
const hdkey = require('hdkey');
const TronWeb = require('tronweb');

const app = express(); // Initialiser Express
const mnemonic = process.env.mnemonic;

// Middleware pour parser les données JSON
app.use(bodyParser.json());

// Fonction pour générer les adresses
async function generateHdWalletAddress(mnemonic, userId) {
  if (!bip39.validateMnemonic(mnemonic)) {
    return {
      success: false,
      message: 'Phrase mnémonique invalide',
    };
  }

  try {
    const seed = await bip39.mnemonicToSeed(mnemonic);
    const hdWallet = hdkey.fromMasterSeed(seed);

    const pathbeperc20 = `m/44'/60'/0'/0/${userId}`;
    const childNodebeperc20 = hdWallet.derive(pathbeperc20);
    const pathtrc20 = `m/44'/195'/0'/0/${userId}`;
    const childNodetrc20 = hdWallet.derive(pathtrc20);

    const privateKeybeperc20 = childNodebeperc20.privateKey.toString('hex');
    const privateKeytrc20 = childNodetrc20.privateKey.toString('hex');

    const wallet = new ethers.Wallet(childNodebeperc20.privateKey);
    const beperc20Address = wallet.address;

    const tron = new TronWeb({ fullHost: 'https://api.trongrid.io' });
    const trc20Address = tron.address.fromPrivateKey(privateKeytrc20);

    return {
      success: true,
      userId: userId,
      addresses: {
        beperc20: {
          privateKey: privateKeybeperc20,
          address: beperc20Address,
        },
        trc20: {
          privateKey: privateKeytrc20,
          address: trc20Address,
        },
      },
    };
  } catch (err) {
    return {
      success: false,
      message: 'Erreur lors de la génération des adresses',
      error: err.message,
    };
  }
}

// Route POST pour générer les adresses
app.post('/generate-wallet', async (req, res) => {
  const password = req.body.password; // Récupérer le mot de passe
  const userId = req.body.userId;
  if (!password || password !== process.env.NODE_JS_PASSWORD) {
    return res.status(403).json({
      success: false,
      message: 'Denied Access',
    });
  }
  if (isNaN(userId)) {
    return res.status(400).json({
      success: false,
      message: 'Le paramètre userId est requis et doit être un nombre valide',
    });
  }

  try {
    const result = await generateHdWalletAddress(mnemonic, userId);
    res.json(result);
  } catch (error) {
    res.status(500).json({
      success: false,
      message: 'Erreur interne du serveur',
      error: error.message,
    });
  }
});

// Démarrer le serveur
app.listen(3000, () => {
  console.log('Serveur prêt sur http://localhost:3000');
});
