const Discord = require('discord.js');
const { ButtonBuilder } = require('discord.js');

module.exports = {
  interaction: {
    name: "kelime-oyunu",
    description: "ğŸ’� Kelime oyununu ayarlamanÄ±za yarar.",
    options: [
      {
        name: "bilgi",
        description: "Kelime oyunu hakkÄ±nda tÃ¼m bilgileri saÄŸlar.",
        type: 1,
        options: []
      },
      {
        name: "ayarla",
        description: "Kelime oyunu sistemini aktif eder.",
        type: 1,
        options: [
          {
            name: "kanal",
            description: "Kelime oyunu kanalÄ±nÄ± seÃ§.",
            type: 7,
            required: true
          },
        ]
      },
      /*{
        name: "sÄ±ralama",
        description: "Kelime oyunu sÄ±ralamasÄ±",
        type: 1,
        options: []
      },*/
      {
        name: "ayarlar",
        description: "Kelime oyununun ayarlarÄ±nÄ± deÄŸiÅŸtirir.",
        type: 2,
        options: [
          {
            name: "Ã¼st-Ã¼ste-yazma",
            description: "OyuncularÄ±n Ã¼st Ã¼ste kelime tÃ¼retmesine izin verir.",
            type: 1,
            options: [
              {
                name: "iÅŸlem",
                description: "Bir oyuncu Ã¼st Ã¼ste kelimeler yazabilsin mi?",
                choices: [
                  { name: "AÃ§", value: "ac" },
                  { name: "Kapat", value: "kapat" }
                ],
                type: 3,
                required: true
              },
            ]
          },
          /*{
            name: "geÃ§miÅŸ-uzunluÄŸu",
            description: "dassda", //DÃ¼zenlenecek
            type: 1,
            options: [
              {
                name: "uzunluk",
                description: "dasdsa",  //DÃ¼zenlenecek
                type: 4,
                required: true
              },
            ],
          },*/
        ]
      },
      {
        name: "sÄ±fÄ±rla",
        description: "Kelime oyununun seÃ§ilen deÄŸerlerini sÄ±fÄ±rlar.",
        type: 2,
        options: [
          /*{
            name: "ayarlar",
            description: "asdsda", //DÃ¼zenlenecek
            type: 1,
            options: []
          },*/
          {
            name: "istatistikler",
            description: "SÄ±ralama, toplam kelime, en uzun kelime gibi deÄŸerleri sÄ±fÄ±rlar.",
            type: 1,
            options: []
          },
          /*{
             name: "kelime-geÃ§miÅŸi",
             description: "asdsda", //DÃ¼zenlenecek
             type: 1,
             options: []
           },*/
        ]
      },
      {
        name: "kapat",
        description: "Kelime oyununu kapatÄ±r. Ancak ayarlar ve istatistikler sÄ±fÄ±rlanmaz.",
        type: 1,
        options: []
      },
    ]
  },
  interactionOnly: true,
  aliases: ["kelimeoyunu", "wordgame", "word-game", "kelime"],
  category: "Games",
  memberPermissions: ["ManageChannels"],
  botPermissions: ["SendMessages", "EmbedLinks", "ManageMessages", "AddReactions"],
  nsfw: false,
  cooldown: false,
  ownerOnly: false,

  async execute(client, interaction, data) {

    const getSubcommand = interaction.options.getSubcommandGroup(false);
    const getCommand = interaction.options.getSubcommand();

    const wordGame = data.guild.wordGame;

    if (getCommand == "bilgi") {

      const destekSunucusuButon = new ButtonBuilder().setLabel('Destek Sunucusu').setURL("https://discord.gg/VppTU9h").setStyle('Link');

      interaction.reply({
        embeds: [
          {
            color: client.settings.embedColors.default,
            author: {
              name: `${client.user.username} â€¢ Kelime Oyunu Sistemi`,
              icon_url: client.settings.icon,
            },
            fields: [
              {
                name: '**Â»** Kelime Oyunu NasÄ±l OynanÄ±r?',
                value: `**â€¢** Kelime oyunu iÃ§in bir kanal ayarlanÄ±r, (o kanal sadece kelime oyunu iÃ§in kullanÄ±lÄ±r) herhangi bir sÃ¶zcÃ¼k ile baÅŸlangÄ±Ã§ yapÄ±lÄ±r, o sÃ¶zcÃ¼ÄŸÃ¼n son harfiyle yeni kelimeler tÃ¼retilmeye Ã§alÄ±ÅŸÄ±lÄ±r. Son kelimenin son harfiyle yeni bir kelime tÃ¼retilir. Oyun bu ÅŸekilde devam eder. AÅŸaÄŸÄ±daki resimde Ã¶rnek bulunuyor.`,
              },
              {
                name: '**Â»** Kelime Oyunu SÄ±ralamasÄ±na NasÄ±l UlaÅŸÄ±rÄ±m?',
                value: `**â€¢** \`/sÄ±ralama\` komutunu Ã§alÄ±ÅŸtÄ±rÄ±p, mesajÄ±n altÄ±ndaki butonlardan kelime oyunu sÄ±ralamasÄ±nÄ± seÃ§erek sÄ±ralamaya ulaÅŸabilirsiniz.`,
              },
              {
                name: '**Â»** Puan NasÄ±l KazanÄ±lÄ±r?',
                value: `**â€¢** Kelimeleriniz ne kadar uzun olursa o kadar Ã§ok puan kazanÄ±rsÄ±nÄ±z. Ek olarak yazdÄ±ÄŸÄ±nÄ±z kelime miktarÄ± da puanlarÄ±nÄ±zÄ± arttÄ±rmaktadÄ±r.`,
              },
              {
                name: '**Â»** Kelime Oyunu KanalÄ±na Oyun Harici Bir Mesaj NasÄ±l YazÄ±lÄ±r?',
                value: `**â€¢** MesajÄ±nÄ±zÄ±n baÅŸÄ±nda **">"** veya **"!"** olmasÄ± yeterlidir.`,
              },
              {
                name: '**Â»** Kelime Oyunu NasÄ±l AyarlanÄ±r?',
                value: `**â€¢** \`/kelime-oyunu Ayarla\` ÅŸeklinde kelime oyununu ayarlayabilirsiniz. Kanal deÄŸiÅŸimlerinde ayarlar ve istatistikler korunmaktadÄ±r.`,
              },
              {
                name: '**Â»** Ãœst Ãœste YazmayÄ± NasÄ±l AÃ§arÄ±m/KapatÄ±rÄ±m?',
                value: `**â€¢** \`/kelime-oyunu Ayarlar Ã¼st-Ã¼ste-yazma\` yazarak bu ayarÄ± deÄŸiÅŸtirebilirsiniz. AÃ§Ä±ldÄ±ÄŸÄ±nda bir Ã¼ye Ã¼st Ã¼ste istediÄŸi kadar kelime yazabilecektir.`,
              },
              /*{
                name: '**Â»** Kelime GeÃ§miÅŸ UzunluÄŸunu NasÄ±l KapatÄ±rÄ±m/BÃ¼yÃ¼tÃ¼rÃ¼m?',
                value: `**â€¢** \`/kelime-oyunu Ayarlar kelime-geÃ§miÅŸi\` yazarak bu ayarÄ± deÄŸiÅŸtirebilirsiniz. Kelime geÃ§miÅŸi Ã¶zelliÄŸi, aynÄ± kelimenin kaÃ§ kelime sonra tekrar yazÄ±labilmesini belirler. Kapatmak iÃ§in 0 yazabilirsiniz.`,
              },*/
              {
                name: '**Â»** Kelime Oyunu DeÄŸerleri (Ä°statistikler vb.) NasÄ±l SÄ±fÄ±rlanÄ±r?',
                value: `**â€¢** \`/kelime-oyunu SÄ±fÄ±rla Ä°statistikler\` ÅŸeklinde kelime oyunununun sÄ±fÄ±rlamak istediÄŸiniz deÄŸerini sÄ±fÄ±rlayabilirsiniz.`,
              },
              {
                name: '**Â»** Kelime Oyunu NasÄ±l KapatÄ±lÄ±r?',
                value: `**â€¢** \`/kelime-oyunu Kapat\` ÅŸeklinde kelime oyununu kapatabilirsiniz. AyarlarÄ±nÄ±z ve istatistikleriniz korunacaktÄ±r.`,
              },
              {
                name: '**Â»** Mevcut AyarlarÄ± NasÄ±l GÃ¶rÃ¼ntÃ¼lerim?',
                value: `**â€¢** \`/ayarlar\` yazÄ±p kelime oyunu sayfasÄ±ndan tÃ¼m ayarlarÄ± gÃ¶rÃ¼ntÃ¼leyebilirsiniz.`,
              },
              {
                name: '**Â»** Ekstra Bilgi',
                value: `**â€¢** Kelime oyununun daha adil bir oyun olabilmesi adÄ±na bazÄ± korumalar ekledik. Nraphy, kelime oyununun sabote edildiÄŸini fark ederse ilgili oyuncular hakkÄ±nda ya da oyun Ã¼zerinde bazÄ± aksiyonlar alabilir.`,
              },
              {
                name: '**Â»** TÃ¼m Bunlara RaÄŸmen Ben AnlamadÄ±m ArkadaÅŸ!',
                value: `**â€¢** AÅŸaÄŸÄ±daki butondan gel [destek sunucumuza](https://discord.gg/QvaDHvuYVm), yardÄ±mcÄ± olalÄ±m. AklÄ±na takÄ±lan nedir?`
              },
            ],
            image: {
              url: 'https://cdn.discordapp.com/attachments/801418986809589771/891592954907623424/unknown.png',
            },
          },
        ],
        components: [
          {
            type: 1, components: [destekSunucusuButon]
          },
        ]
      });

    } else if (getCommand == "ayarla") {

      const channel = interaction.options.getChannel("kanal");

      if (!await client.functions.channelChecker(interaction, channel, ["ViewChannel", "SendMessages", "EmbedLinks"])) return;

      //Kanal Zaten Varsa (Kanal DeÄŸiÅŸikliÄŸi)
      if (wordGame?.channel && interaction.guild.channels.cache.has(wordGame.channel)) {

        //Kelime Oyunu Zaten AynÄ± Kanalda
        if (wordGame.channel == channel.id) {
          return interaction.reply({
            embeds: [
              {
                color: client.settings.embedColors.red,
                title: '**Â»** Kelime Oyunu KanalÄ± Zaten AynÄ±!',
                description: `**â€¢** Kapatmak iÃ§in \`/kelime-oyunu Kapat\` yazabilirsin.`
              }
            ]
          });
        }

        //Kelime Oyunu KanalÄ± DeÄŸiÅŸtirildi
        else {
          //db.set(`guilds.${interaction.guild.id}.wordGame.channel`, channel.id);
          data.guild.wordGame.channel = channel.id;
          data.guild.wordGame.setupChannel = interaction.channel.id;
          data.guild.markModified('wordGame');
          await data.guild.save();

          return interaction.reply({
            embeds: [
              {
                color: client.settings.embedColors.green,
                title: '**Â»** Kelime Oyunu KanalÄ± DeÄŸiÅŸtirildi!',
                description: `**â€¢** Kanal ${channel.toString()} olarak deÄŸiÅŸtirildi.`
              }
            ]
          });
        }

      }

      /*db.set(`guilds.${interaction.guild.id}.wordGame.channel`, channel.id);
      db.set(`guilds.${interaction.guild.id}.wordGame.lastWord`, "n");
      db.set(`guilds.${interaction.guild.id}.wordGame.setupInChannel`, interaction.channel.id);*/
      data.guild.wordGame.channel = channel.id;
      data.guild.wordGame.setupChannel = interaction.channel.id;
      data.guild.markModified('wordGame');
      await data.guild.save();

      interaction.reply({
        embeds: [
          {
            color: client.settings.embedColors.green,
            title: '**Â»** Kelime Oyunu BaÅŸarÄ±yla AyarlandÄ±!',
            author: {
              name: `${client.user.username} â€¢ Kelime Oyunu`,
              icon_url: client.settings.icon,
            },
            fields: [
              {
                name: '**Â»** Kanal',
                value: `**â€¢** ${channel}`,
                inline: true,
              },
              {
                name: '**Â»** BaÅŸlangÄ±Ã§ Harfi',
                value: `**â€¢** \`${data.guild.wordGame?.lastWord.word?.slice(-1).toLocaleUpperCase('tr-TR') || "N"}\``,
                inline: true,
              },
            ]
          }
        ]
      });

    } /*else if (getSubcommand == "sÄ±ralama") {

      interaction.reply({
        embeds: [
          {
            color: client.settings.embedColors.red,
            title: '**Â»** TasÄ±ndÄ±k Abicim!',
            description: `**â€¢** \`/sÄ±ralama\` komutuna tasÄ±ndÄ±k, uÄŸrayÄ±p cayÄ±mÄ±zÄ± icebilirsin :)`
          }
        ]
      });

    }*/ else if (getSubcommand == "ayarlar") {

      if (getCommand == "Ã¼st-Ã¼ste-yazma") {

        const operation = interaction.options.getString("iÅŸlem");

        if (operation == "ac") {

          //db.set(`guilds.${interaction.guild.id}.wordGame.writeMore`, true);
          data.guild.wordGame.writeMore = true;
          data.guild.markModified('wordGame');
          await data.guild.save();

          return interaction.reply({
            embeds: [
              {
                color: client.settings.embedColors.green,
                title: '**Â»** Birden Fazla Kez Yazma AÃ§Ä±ldÄ±!',
                description: `**â€¢** ArtÄ±k bir oyuncu tekrar yazmak iÃ§in araya baÅŸkasÄ±nÄ±n girmesini beklemeyecek.`
              }
            ]
          });

        } else if (operation == "kapat") {

          //db.set(`guilds.${interaction.guild.id}.wordGame.writeMore`, false);
          data.guild.wordGame.writeMore = false;
          data.guild.markModified('wordGame');
          await data.guild.save();

          return interaction.reply({
            embeds: [
              {
                color: client.settings.embedColors.green,
                title: '**Â»** Birden Fazla Kez Yazma KapatÄ±ldÄ±!',
                description: `**â€¢** ArtÄ±k bir oyuncu Ã¼st Ã¼ste kelimeler tÃ¼retemeyecek.`
              }
            ]
          });

        }

      } else if (getCommand == "geÃ§miÅŸ-uzunluÄŸu") {

      }

    } else if (getSubcommand == "sÄ±fÄ±rla") {

      if (getCommand == "istatistikler") {

        if (!wordGame?.stats)
          return interaction.reply({
            embeds: [
              {
                color: client.settings.embedColors.red,
                title: '**Â»** Ä°statistiklerin SÄ±fÄ±rlanmasÄ± Ä°Ã§in Yeterli Veri Yok!',
                description: `**â€¢** AzÄ±cÄ±k veri kas, canÄ±nÄ± yerim bak.`
              }
            ],
            components: []
          });

        const { buttonConfirmation } = require("../../modules/Functions");
        if (!await buttonConfirmation(interaction, [
          {
            color: client.settings.embedColors.default,
            title: '**Â»** Kelime Oyunu Ä°statistiklerinin SÄ±fÄ±rlanmasÄ±nÄ± OnaylÄ±yor musun?',
            description:
              `**â€¢** SÄ±ralama, ortalama harf uzunluÄŸu, toplam kelime, en uzun kelime ve kelime geÃ§miÅŸi sÄ±fÄ±rlanacak.\n` +
              `**â€¢** Silinen bilgilerin bir kopyasÄ± TXT dosyasÄ± olarak verilecek.\n`
          }
        ])) return interaction.editReply({
          embeds: [
            {
              color: client.settings.embedColors.red,
              title: '**Â»** SÄ±fÄ±rlama Ä°ÅŸlemini Ä°ptal Ettim!',
              description: `**â€¢** Buraya ne yazsam bilemedim. Ä°ptalin ne aÃ§Ä±klamasÄ± olabilir ki?`
            }
          ],
          components: []
        }).catch(() => { });

        await interaction.editReply({
          embeds: [
            {
              color: client.settings.embedColors.default,
              title: '**Â»** Kelime Oyunu Ä°statistikleri SÄ±fÄ±rlanÄ±yor...',
              description: `**â€¢** DosyanÄ±n oluÅŸturulmasÄ± iÅŸlemi biraz zaman alabilir.`
            }
          ],
          components: []
        });

        //SÄ±ralama
        let wordGameLeaderboard = [];
        if (wordGame.stats)
          for await (let user of Object.keys(wordGame.stats || {})) {
            let statUser = wordGame.stats[user];
            wordGameLeaderboard.push({ ID: user, wordLengths: statUser.wordLength, words: statUser.wordCount, point: ((statUser.wordLength ? statUser.wordCount : 0) / 2 + statUser.wordCount).toFixed(0) });
          }
        wordGameLeaderboard.sort((a, b) => b.point - a.point).splice(100);
        let TXT_Leaderboard = wordGameLeaderboard
          .map(data => `${wordGameLeaderboard.indexOf(data) + 1}# - ${interaction.guild.members.cache.get(data.ID)?.user.tag || data.ID} â€¢ ${data.point} Puan - ${data.words} Kelime`);

        //Ä°statistikler
        let wordGameStats = { totalWordLengths: 0, totalWords: 0 };
        if (wordGame.stats) for await (let user of Object.keys(wordGame.stats || {})) {
          let statUser = await wordGame.stats[user];
          wordGameStats = {
            totalWordLengths: wordGameStats.totalWordLengths + (statUser.wordLength ? statUser.wordLength : 0),
            totalWords: wordGameStats.totalWords + statUser.wordCount
          };
        }
        let longestWordUser;
        if (wordGame.longestWord) await client.users.fetch(wordGame.longestWord.author).then(async user => { longestWordUser = user; });

        //TXT OluÅŸturma
        let attachment = new Discord.AttachmentBuilder(
          Buffer.from(
            `Ortalama Harf UzunluÄŸu: ${wordGameStats.totalWordLengths > 0 ? `${(wordGameStats.totalWordLengths / wordGameStats.totalWords).toFixed(2)} Harf` : "Harf uzunluÄŸu ortalamasÄ± iÃ§in yeterli veri yok."}\n` +
            `Toplam Kelime: ${wordGameStats.totalWords ? `${wordGameStats.totalWords} Kelime` : "HiÃ§ kelime verisi yok."}\n` +
            `En Uzun Kelime: ${wordGame.longestWord ?
              `${client.capitalizeFirstLetter(wordGame.longestWord.word, "tr")} (${wordGame.longestWord.word.length} Harf) (${longestWordUser.tag} tarafÄ±ndan)`
              : "Veri yok"}\n\n` +

            `${TXT_Leaderboard.join('\n')}`, 'utf-8'),
          { name: "Nraphy-KelimeOyunuSiralamasi.txt" });

        /*db.delete(`guilds.${interaction.guild.id}.wordGame.stats`);
        db.delete(`guilds.${interaction.guild.id}.wordGame.longestWord`);
        db.delete(`guilds.${interaction.guild.id}.wordGame.history`);*/
        data.guild.wordGame.stats = undefined;
        data.guild.wordGame.longestWord = undefined;
        data.guild.wordGame.history = undefined;
        data.guild.markModified('wordGame');
        await data.guild.save();

        interaction.editReply({
          embeds: [
            {
              color: client.settings.embedColors.green,
              title: '**Â»** Kelime Oyunu Ä°statistikleri BaÅŸarÄ±yla SÄ±fÄ±rlandÄ±!',
              description: `**â€¢** EÄŸer oyun aÃ§Ä±k ise mevcut ayarlarla oynanmaya devam edilecek.`
            }
          ],
          files: [attachment]
        });

      } else if (getCommand == "kelime-geÃ§miÅŸi") {

      }

    } else if (getCommand == "kapat") {

      if (!wordGame?.channel) {
        return interaction.reply({
          embeds: [
            {
              color: client.settings.embedColors.red,
              title: '**Â»** Kelime Oyunu Zaten AyarlÄ± DeÄŸil!',
              description: `**â€¢** Olmayan bir oyunu neden kapatmak istiyorsun ki?`
            }
          ]
        });

      } else {

        //db.delete(`guilds.${interaction.guild.id}.wordGame.channel`);
        data.guild.wordGame.channel = undefined;
        data.guild.markModified('wordGame');
        await data.guild.save();

        return interaction.reply({
          embeds: [
            {
              color: client.settings.embedColors.green,
              title: '**Â»** Kelime Oyunu BaÅŸarÄ±yla KapatÄ±ldÄ±!',
              description:
                `**â€¢** Tekrar aÃ§tÄ±ÄŸÄ±nÄ±zda mevcut ayarlarÄ±nÄ±z ve istatistiklerinizle devam edebilirsiniz.\n` +
                `**â€¢** Ä°statistikleri de sÄ±fÄ±rlamak isterseniz: \`/kelime-oyunu SÄ±fÄ±rla Ä°statistikler\``
            }
          ]
        });
      }

    }

  }
};