// 📁 events/interactionCreate.js

const fetch = (...args) => import('node-fetch').then(({ default: fetch }) => fetch(...args));
const {
  ChannelType,
  ButtonBuilder,
  ButtonStyle,
  ActionRowBuilder,
  EmbedBuilder,
  PermissionsBitField,
  ModalBuilder,
  TextInputBuilder,
  TextInputStyle,
} = require('discord.js');

const discordTranscripts = require('discord-html-transcripts');
const config = require('../config.js');
const fs = require('fs');
const path = require('path');

const BLACKLIST_FILE = path.join(__dirname, '../blacklist.json');

function loadBlacklist() {
  try {
    if (!fs.existsSync(BLACKLIST_FILE)) return {};
    const raw = fs.readFileSync(BLACKLIST_FILE, 'utf8');
    const json = JSON.parse(raw || '{}');
    return typeof json === 'object' && json !== null ? json : {};
  } catch (e) {
    console.error('Failed to load blacklist.json', e);
    return {};
  }
}

module.exports = {
  name: 'interactionCreate',

  async execute(interaction, client) {
    if (!interaction.isButton() && !interaction.isModalSubmit()) return;

    const guildId = interaction.guild?.id;
    const guildName = interaction.guild?.name;
    const user = interaction.user;
    const serverConfig = config[guildId];
    if (!serverConfig) return;

    const blacklist = loadBlacklist();
    const guildBl = blacklist.blacklist || { servers: [], users: [] };

    // ===== إنشاء تذكرة شراكة (مع فحص البلاك ليست للعضو) =====
    if (interaction.isButton() && interaction.customId === 'partner_ticket') {
      // فحص إذا العضو محظور في بلاك ليست السيرفر
      if (Array.isArray(guildBl.users) && guildBl.users.includes(user.id)) {
        return interaction.reply({ content: '🚫 أنت محظور من فتح تذاكر الشراكات في هذا السيرفر.', ephemeral: true });
      }

      try {
        // إعداد صلاحيات المشرفين
        const permissionOverwrites = [
          { id: interaction.guild.id, deny: [PermissionsBitField.Flags.ViewChannel] },
          { id: user.id, allow: [PermissionsBitField.Flags.ViewChannel, PermissionsBitField.Flags.SendMessages] },
          { id: client.user.id, allow: [PermissionsBitField.Flags.ViewChannel, PermissionsBitField.Flags.SendMessages] },
        ];

        if (serverConfig.adminPartnerID) {
          permissionOverwrites.push({
            id: serverConfig.adminPartnerID,
            allow: [PermissionsBitField.Flags.ViewChannel, PermissionsBitField.Flags.SendMessages, PermissionsBitField.Flags.ManageChannels]
          });
        }

        const ticketChannel = await interaction.guild.channels.create({
          name: `partner・${user.username}`.toLowerCase().replace(/ /g, '・'),
          type: ChannelType.GuildText,
          parent: serverConfig.ticketCategoryId || null,
          topic: `partner-ticket-${user.id};serverId=null;serverName=null`,
          permissionOverwrites
        });

        const embed = new EmbedBuilder()
          .setTitle(`📝 طلب شراكة مع ${guildName}`)
          .setColor('#00bcd4')
          .setThumbnail(interaction.guild.iconURL({ dynamic: true }))
          .setDescription(serverConfig.welcomeMessage || 'مرحبًا بك في تذكرة الشراكة! تأكد من قراءة الشروط أدناه بعناية.')
          .addFields(
            { name: '🟢 الشروط الأساسية', value: serverConfig.levels?.basic?.requirements?.join('\n') || 'غير محددة' }
          )
          .setFooter({ text: 'يرجى الالتزام بجميع الشروط قبل تقديم طلب الشراكة' })
          .setTimestamp();

        const sendButton = new ButtonBuilder()
          .setCustomId('submit_partner')
          .setLabel('📤 إرسال رسالة الشراكة')
          .setStyle(ButtonStyle.Primary);

        const closeButton = new ButtonBuilder()
          .setCustomId('close_ticket')
          .setLabel('❌ إغلاق التذكرة')
          .setStyle(ButtonStyle.Danger);

        const row = new ActionRowBuilder().addComponents(sendButton, closeButton);

        await ticketChannel.send({
          content: `# 🤝 ${serverConfig.partnerPrefix || ''} — ${user} — <@&${serverConfig.adminPartnerID}>`,
          embeds: [embed],
          components: [row],
        });

        await interaction.deferReply({ ephemeral: true });
        await interaction.editReply({ content: `✅ تم فتح تذكرتك بنجاح: ${ticketChannel}` });
      } catch (err) {
        console.error('Failed to create ticket channel:', err);
        return interaction.reply({ content: '❌ حدث خطأ أثناء إنشاء التذكرة.', ephemeral: true });
      }
    }

    // ===== إغلاق التذكرة (Transcript + Log) =====
    if (interaction.isButton() && interaction.customId === 'close_ticket') {
      try {
        const transcript = await discordTranscripts.createTranscript(interaction.channel, {
          limit: -1,
          returnBuffer: false,
          fileName: `transcript-${interaction.channel.name}.html`,
        });

        const topic = interaction.channel.topic || '';
        const parts = topic.split(';');
        const serverId = parts.find(p => p.startsWith('serverId='))?.split('=')[1] || 'غير معروف';
        const serverName = parts.find(p => p.startsWith('serverName='))?.split('=')[1] || 'غير معروف';
        const serverDesc = parts.find(p => p.startsWith('serverDesc='))?.split('=')[1] || 'غير معروف';
        const serverInvite = parts.find(p => p.startsWith('serverInvite='))?.split('=')[1] || 'غير معروف';

        const logChannel = interaction.guild.channels.cache.get(serverConfig.logChannelId);
        if (logChannel) {
          const logEmbed = new EmbedBuilder()
            .setTitle('🔒 تم إغلاق تذكرة')
            .setColor('Red')
            .addFields(
              { name: '👤 بواسطة', value: `${interaction.user.tag} (${interaction.user.id})` },
              { name: '📌 القناة', value: `${interaction.channel.name}` },
              { name: 'اسم السيرفر', value: `${serverName} (${serverId})` },
              { name: 'وصف السيرفر', value: `${serverDesc}` },
              { name: 'رابط السيرفر', value: `${serverInvite}` },
            )
            .setTimestamp();

          await logChannel.send({ embeds: [logEmbed], files: [transcript] });
        }

        await interaction.reply({ content: '🔒 تم إغلاق التذكرة وسيتم حذفها بعد 5 ثوانٍ...', ephemeral: false });
        setTimeout(() => interaction.channel.delete().catch(console.error), 5000);
      } catch (err) {
        console.error('❌ فشل أثناء محاولة إغلاق التذكرة:', err);
        await interaction.reply({ content: '❌ حدث خطأ أثناء إغلاق التذكرة.', ephemeral: true });
      }
    }

    // ===== فتح نموذج الشراكة =====
    if (interaction.isButton() && interaction.customId === 'submit_partner') {
      const modal = new ModalBuilder()
        .setCustomId('partnerModal')
        .setTitle('📤 إرسال طلب شراكة')
        .addComponents(
          new ActionRowBuilder().addComponents(
            new TextInputBuilder().setCustomId('serverName').setLabel('📛 اسم السيرفر').setStyle(TextInputStyle.Short).setRequired(true)
          ),
          new ActionRowBuilder().addComponents(
            new TextInputBuilder().setCustomId('serverDesc').setLabel('📝 وصف السيرفر').setStyle(TextInputStyle.Paragraph).setRequired(true)
          ),
          new ActionRowBuilder().addComponents(
            new TextInputBuilder().setCustomId('serverInvite').setLabel('🔗 رابط الدعوة').setStyle(TextInputStyle.Short).setRequired(true)
          )
        );

      return interaction.showModal(modal);
    }

    // ===== إرسال الشراكة (مع فحص البلاك ليست للـ server بعد إدخال البيانات) =====
    if (interaction.isModalSubmit() && interaction.customId === 'partnerModal') {
      const fsLocal = require('fs');
      const pathLocal = require('path');
      const compelet = require('../compelet.js');

      const name = interaction.fields.getTextInputValue('serverName');
      let desc = interaction.fields.getTextInputValue('serverDesc');
      const invite = interaction.fields.getTextInputValue('serverInvite');

      desc = desc.replace(/(https?:\/\/)?(www\.)?discord\.gg\/\S+/gi, '');
      if (!invite.startsWith('https://discord.gg/')) {
        return await interaction.reply({ content: '🚫 رابط غير صالح.', ephemeral: true });
      }

      try {
        const inviteCode = invite.split('/').pop();
        const response = await fetch(`https://discord.com/api/v10/invites/${inviteCode}?with_counts=true&with_expiration=true`);
        if (!response.ok) throw new Error('Invalid invite');
        const fetchedInvite = await response.json();

        const serverId = fetchedInvite.guild?.id;
        const memberCount = fetchedInvite.approximate_member_count || 0;
        const onlineCount = fetchedInvite.approximate_presence_count || 0;

        // تهيئة compelet لو مش موجود
        if (!compelet) compelet = { partners: {}, blacklist: {} };

        // منع التكرار
        if (compelet.partners[serverId]) {
          return await interaction.reply({ content: `🚫 السيرفر **${name}** مسجل بالفعل في قائمة الشراكات لهذا السيرفر.`, ephemeral: true });
        }

        // ===== فحص البلاك ليست الخاص بالسيرفر (blacklist.json مفهرس حسب guildId) =====
const bl = loadBlacklist();
const guildBlNow = bl.blacklist || { servers: [], users: [] };

// فحص السيرفر
if (Array.isArray(guildBlNow.servers) && guildBlNow.servers.includes(serverId)) {
  return await interaction.reply({
    content: '🚫 هذا السيرفر محظور في البلاك ليست الخاصة بهذا السيرفر.',
    ephemeral: true
  });
}

// فحص العضو
if (Array.isArray(guildBlNow.users) && guildBlNow.users.includes(interaction.user.id)) {
  return await interaction.reply({
    content: '🚫 أنت محظور من تقديم طلبات الشراكة في هذا السيرفر.',
    ephemeral: true
  });
}

        // التحقق من الشروط
        let valid = false;
        let levelUsed = '❌ غير مطابق';
        const { basic } = serverConfig.levels;
        if (memberCount >= basic.minMembers && onlineCount >= basic.minOnline) {
          valid = true; levelUsed = '🟢 أساسية';
        }

        if (!valid) {
          return await interaction.reply({
            content: `🚫 السيرفر لا يستوفي شروط الشراكة.\n👥 الأعضاء: **${memberCount}**\n🟢 الأونلاين: **${onlineCount}**`,
            ephemeral: true,
          });
        }

        // حفظ الشراكة
        compelet.partners[serverId] = {
          name, desc, invite,
          addedBy: interaction.user.tag,
          ticket: interaction.channel.name,
          date: new Date().toISOString(),
        };

        const filePath = pathLocal.join(__dirname, '../compelet.js');
        fsLocal.writeFileSync(filePath, `module.exports = ${JSON.stringify(compelet, null, 2)};`, 'utf8');

        // تحديث topic القناة
        await interaction.channel.setTopic(`partner-ticket-${interaction.user.id};serverId=${serverId};serverName=${name};serverDesc=${desc};serverInvite=${invite}`);

        const partnerRoom = interaction.guild.channels.cache.get(serverConfig.partnerChannel);
        if (!partnerRoom) {
          return await interaction.reply({ content: '🚫 روم الشراكات غير مضبوط.', ephemeral: true });
        }

        await interaction.reply({ content: `✅ تم قبول الشراكة (${levelUsed})، وجارٍ إرسالها...`, ephemeral: true });
        if (serverConfig.defaultMessage) await interaction.channel.send(serverConfig.defaultMessage);

        await partnerRoom.send(`# ${guildName} 🤝 ${name}\n${desc}\n${invite}`);
        if (serverConfig.gifUrl) await partnerRoom.send(serverConfig.gifUrl);

        if (serverConfig.partnerRoleId) {
          const role = interaction.guild.roles.cache.get(serverConfig.partnerRoleId);
          if (role) {
            const member = interaction.guild.members.cache.get(interaction.user.id);
            if (member) {
              await member.roles.add(role).catch(err => console.error('❌ فشل في إعطاء الرتبة:', err));
            }
          }
        }

        const confirm = await interaction.channel.send('📤 تم إرسال الشراكة بنجاح.');
        setTimeout(() => confirm.delete().catch(() => {}), 5000);

      } catch (err) {
        console.error(err);
        await interaction.reply({ content: '❌ حدث خطأ أثناء معالجة الرابط أو السيرفر غير موجود.', ephemeral: true });
      }
    }
  }
};
