import { Client, GatewayIntentBits, WebhookClient, AuditLogEvent, OAuth2Scopes, Options } from 'discord.js';
// import commands from './commands.js';
import firstDetector from './detectors/allDetector.js'; 

// const webhookClient = process.env.LOGS_WEBHOOK ? new WebhookClient({ url: process.env.LOGS_WEBHOOK }) : null;

const client = new Client({
  makeCache: Options.cacheWithLimits({
    MessageManager: 0, // le bot ne se souviendra pas des anciens messages (pas de cache)
  }),
  intents: [
    GatewayIntentBits.Guilds,
    GatewayIntentBits.GuildMessages,
    GatewayIntentBits.MessageContent,
  ]
});

// Démarrage 
client.on('ready', async () => {
  console.log(`Logged in as ${client.user?.tag ?? 'unknown'}`);

  webhookClient?.send({
    content: `Logged in as ${client.user?.tag ?? 'unknown'}`
  });

  await client.guilds.fetch();

  console.log('Bot is ready!');
  console.log(client.generateInvite({
    scopes: [OAuth2Scopes.Bot],
    permissions: [
      'SendMessages',
      'ViewAuditLog',
      'ViewChannel',
      'UseApplicationCommands',
      'EmbedLinks',
      'ReadMessageHistory'
    ]
  }));
});

// Gestion des Messages (Listeners) 

// Fonction locale pour traiter un message (remplace newMessageListener)
async function handleMessage(message) {
  try {
    const reply = await firstDetector.createReply(message);
    if (reply) {
      await message.reply(reply);
    }
  } catch (e) {
    console.error('Erreur dans le détecteur:', e);
  }
}

client.on('messageCreate', async (message) => {
  if (message.author.bot) return;
  await handleMessage(message);
});

client.on('messageUpdate', async (oldMessage, newMessage) => {
  let message = newMessage;
  
  if (message.partial) {
    try {
      message = await message.fetch();
    } catch (e) {
      console.error('Error while fetching message', e);
      return;
    }
  }

  if (!message.author || message.author.bot) return;
  if (oldMessage.content === message.content) return; // Pas de changement de texte
  if (!message.content) return;

  // Si l'ancien message déclenchait déjà un "quoi" (regex simple), on évite de spammer
  if (oldMessage.content && oldMessage.content.match(/(\b|^)quoi(\b|$)/i)) {
    return;
  }

  await handleMessage(message);
});

client.on(Events.ClientReady, () => {
    console.log(`Hello World !`);
});

client.login(process.env.DISCORD_TOKEN);