const axios = require('axios');

module.exports = async (client, message, wordGame, guildData) => {

  try {

    if (message.content.startsWith("!") || message.content.startsWith(">") || message.author.bot) return;

    //---------------Permissions---------------//

    const botPermissions = ["ViewChannel", "SendMessages", "EmbedLinks"];
    const permissions = require("../../utils/Permissions.json");

    let clientPerms = [];

    botPermissions.forEach((perm) => {
      if (!message.guild.channels.cache.get(wordGame.channel).permissionsFor(message.guild.members.me).has(perm)) {
        clientPerms.push(permissions[perm]);
      }
    });

    if (clientPerms.length > 0) {

      client.logger.log(`Kelime oyunu kanalÄ±nda bir/birkaÃ§ yetkim bulunmadÄ±ÄŸÄ± iÃ§in kelime oyunu sistemi sÄ±fÄ±rlanÄ±yor... â€¢ ${message.guild.name} (${message.guild.id})`);
      guildData.wordGame.channel = undefined;
      guildData.markModified('wordGame');
      await guildData.save();

      return message.guild.channels.cache.get(wordGame.setupChannel)?.send({
        embeds: [{
          color: client.settings.embedColors.red,
          author: {
            name: `Kelime Oyununu Ã‡alÄ±ÅŸtÄ±rabilmem Ä°Ã§in Gereken Ä°zinlere Sahip DeÄŸilim!`,
            icon_url: message.guild.iconURL(),
          },
          description: `**Â»** ${message.guild.channels.cache.get(wordGame.channel)} kanalÄ±nda yeterli yetkiye sahip olmadÄ±ÄŸÄ±m iÃ§in kelime oyunu sistemini sÄ±fÄ±rladÄ±m.`,
          fields: [
            {
              name: '**Â»** Ä°htiyacÄ±m Olan Ä°zinler;',
              value: "**â€¢** " + clientPerms.map((p) => `${p}`).join("\n**â€¢** "),
            },
          ]
        }]
      }).catch(() => { });

    }

    //---------------Permissions---------------//

    //---------------Warner---------------//

    async function warner(user, title, description, deleteMessage = true) {

      //UyarÄ± Metni
      const userCache = client.userDataCache[user.id] || (client.userDataCache[user.id] = {});
      if (!userCache?.lastWarn || Date.now() - userCache.lastWarn > 5000) {
        userCache.lastWarn = Date.now();
        message.channel.send({
          content: user.toString(),
          embeds: [
            {
              color: client.settings.embedColors.red,
              title: `**Â»** ${title}`,
              description: `**â€¢** ${description}`
            }
          ]
        }).then(msg => setTimeout(() => msg.delete().catch(() => { }), 4500));
      }

      //Mesaj Silme
      if (deleteMessage) message.delete().catch(() => { });

    }

    //---------------Warner---------------//

    //Ãœst Ãœste Yazma
    if (!wordGame.writeMore && wordGame.lastWord?.author == message.author.id) {
      return warner(
        message.author,
        "Hey, Dur! Ãœst Ãœste Kelimeler TÃ¼retemezsin",
        "BaÅŸka birisinin bir kelime tÃ¼retmesini beklemelisin."
      );
    }

    //Sadece DÃ¼zgÃ¼n Harfler KullanmalÄ±sÄ±n!
    const ingilizceKarakterlerMapping = {
      'Ã¢': 'a',
      'Ã‚': 'A',
      'Ä±': 'i',
      'Ä°': 'I',
      'Ã¼': 'u',
      'Ãœ': 'U',
      'Ã–': 'O',
      'Ã¶': 'o',
      'Ã‡': 'C',
      'Ã§': 'c',
      'ÅŸ': 's',
      'Å�': 'S',
      'Ä�': 'G',
      'ÄŸ': 'g'
    };
    if (/[^a-zA-Z]/.test(message.content.trim().split('').map(c => ingilizceKarakterlerMapping[c] || c).join(''))) {
      return warner(
        message.author,
        "Sadece DÃ¼zgÃ¼n Harfler KullanmalÄ±sÄ±n!",
        "SayÄ±, sembol veya boÅŸluk iÃ§ermemeli."
      );
    }

    //MuvaffakiyetsizleÅŸtiricileÅŸtiriveremeyebileceklerimizdenmiÅŸsinizcesine
    if (message.content.length > 70) {
      return warner(
        message.author,
        "Bu Kadar Uzun SÃ¶zcÃ¼k yok! AÅŸaÄŸÄ±daki SÃ¶zcÃ¼k Bile 70 Harf :D?",
        "MuvaffakiyetsizleÅŸtiricileÅŸtiriveremeyebileceklerimizdenmiÅŸsinizcesine."
      );
    }

    //DayÄ±cÄ±m Resim/Dosya Ne Alaka?
    if (!message.content) {
      return warner(
        message.author,
        "DayÄ±cÄ±m Resim/Dosya Ne Alaka?",
        "Yani aÃ§Ä±klama yapmaya gerek yok. Bence tabii..."
      );
    }

    let kÃ¼Ã§Ã¼kHarfliKelime = message.content.toLocaleLowerCase('tr-TR');
    let Ã¶ncekiKelime = wordGame.lastWord?.word || "n";

    //Ã–nceki SÃ¶zcÃ¼kten FarklÄ± Bir SÃ¶zcÃ¼k BulmalÄ±sÄ±n!
    if (Ã¶ncekiKelime == kÃ¼Ã§Ã¼kHarfliKelime) {
      return warner(
        message.author,
        "Ã–nceki SÃ¶zcÃ¼kten FarklÄ± Bir SÃ¶zcÃ¼k BulmalÄ±sÄ±n!",
        `Son sÃ¶zcÃ¼k olan **${client.capitalizeFirstLetter(Ã¶ncekiKelime, "tr")}** sÃ¶zcÃ¼ÄŸÃ¼nÃ¼ belirtemezsin.`
      );
    }

    //Ã–nceki SÃ¶zcÃ¼ÄŸÃ¼n Son Harfiyle BaÅŸlayan Bir SÃ¶zcÃ¼k BulmalÄ±sÄ±n!
    if (kÃ¼Ã§Ã¼kHarfliKelime.slice(0, 1) !== Ã¶ncekiKelime.slice(-1)) {
      return warner(
        message.author,
        "Ã–nceki SÃ¶zcÃ¼ÄŸÃ¼n Son Harfiyle BaÅŸlayan Bir SÃ¶zcÃ¼k BulmalÄ±sÄ±n!",
        `SÃ¶zcÃ¼ÄŸÃ¼n, **${Ã¶ncekiKelime.slice(-1).toLocaleUpperCase('tr-TR')}** harfiyle baÅŸlamalÄ±.`
      );
    }

    //1 Harfli SÃ¶zcÃ¼k mÃ¼ Olur ki?
    if (message.content.length < 2) {
      return warner(
        message.author,
        "1 Harfli SÃ¶zcÃ¼k mÃ¼ Olur ki?",
        "Olmaz ki! Yoksa olur mu? Yoo olmaz. Olma ihtimali var mÄ±? :thinking:"
      );
    }

    //En Az 3 Harfli Bir SÃ¶zcÃ¼k BulmalÄ±sÄ±n!
    if (message.content.length < 3) {
      return warner(
        message.author,
        "En Az 3 Harfli Bir SÃ¶zcÃ¼k BulmalÄ±sÄ±n!",
        "Oyun basit olmasÄ±n diye bÃ¶yle. Yapacak bir ÅŸey yok. :confused:"
      );
    }

    //BelirttiÄŸin SÃ¶zcÃ¼k YakÄ±n Zamanda KullanÄ±lmÄ±ÅŸ!
    if ((wordGame.history || []).includes(kÃ¼Ã§Ã¼kHarfliKelime)) {
      return warner(
        message.author,
        "BelirttiÄŸin SÃ¶zcÃ¼k YakÄ±n Zamanda KullanÄ±lmÄ±ÅŸ!",
        `Bu nedenle ÅŸu an **${client.capitalizeFirstLetter(kÃ¼Ã§Ã¼kHarfliKelime, "tr")}** sÃ¶zcÃ¼ÄŸÃ¼nÃ¼ kullanamazsÄ±n.`
      );
    }

    const webUyarlamaMapping = {
      'Ä±': '%C4%B1',
      'ÅŸ': "%C5%9F",
      'Ã¼': "%C3%BC",
      'Ã§': "%C3%A7",
      'ÄŸ': "%C4%9F",
      'Ã¶': "%C3%B6",
      'Ä°': "i",
      ' ': "+"
    };
    let webUygunÃ‡evirilmiÅŸKelime = kÃ¼Ã§Ã¼kHarfliKelime.split('').map(c => webUyarlamaMapping[c] || c).join('');

    //Ã–yle Bir Kelime Yok kiii!
    if (
      !require('../../utils/TDK-Kelimeler.json').includes(kÃ¼Ã§Ã¼kHarfliKelime) &&
      //(await axios.get(`https://sozluk.gov.tr/gts?ara=${webUygunÃ‡evirilmiÅŸKelime}`))?.data?.error &&
      (await (axios.get(`https://sozluk.gov.tr/gts?ara=${webUygunÃ‡evirilmiÅŸKelime}`)
        .then(result => {
          if (result.data?.error) return true;
          if (result.isAxiosError) return true;
          return false;
        })
        .catch(() => true)
      ))
    ) {
      return warner(
        message.author,
        "Ã–yle Bir Kelime Yok kiii!",
        `TDK'de **${client.capitalizeFirstLetter(kÃ¼Ã§Ã¼kHarfliKelime, "tr")}** ÅŸeklinde bir sÃ¶zcÃ¼k bulunmuyor.`
      );
    }

    //Tepki
    message.react('âœ…')
      .catch(error => {
        if (error.code === 90001)
          warner(
            message.author,
            "MesajÄ±na Tepki Ekleyemiyorum!",
            `Beni engellemiÅŸ olabilirsin :rage:\n` +
            `**â€¢** Ä°stersen [destek sunucumuzdan](https://discord.gg/VppTU9h) yardÄ±m alabilirsin ğŸ¥º`,
            false
          );
        else if (error.code !== 10008)
          client.logger.error(error);
      });

    //Ä°statistikler
    (wordGame.stats ||= {})[message.author.id] ||= { wordCount: 0, wordLength: 0 };
    wordGame.stats[message.author.id].wordCount += 1;
    wordGame.stats[message.author.id].wordLength += kÃ¼Ã§Ã¼kHarfliKelime.length;

    //En uzun kelime
    if (kÃ¼Ã§Ã¼kHarfliKelime.length > (wordGame.longestWord?.word?.length || 0))
      wordGame.longestWord = { author: message.author.id, word: kÃ¼Ã§Ã¼kHarfliKelime };

    //GeÃ§miÅŸ
    (wordGame.history ||= []).push(kÃ¼Ã§Ã¼kHarfliKelime);
    wordGame.history = wordGame.history.slice(-150);

    //YumuÅŸak G
    if (kÃ¼Ã§Ã¼kHarfliKelime.slice(-1) == "ÄŸ") {

      let yeniHarf = makeid(1).toLocaleLowerCase('tr-TR');

      message.channel.send({
        embeds: [
          {
            color: client.settings.embedColors.default,
            author: {
              name: 'Nraphy â€¢ Kelime Oyunu',
              icon_url: client.settings.icon
            },
            title: `**Â»** SÃ¶zcÃ¼ÄŸÃ¼n YumuÅŸak G Ä°le Bitiyor!`,
            description: `**â€¢** Bu yÃ¼zden bir sonraki sÃ¶zcÃ¼k **${yeniHarf.toLocaleUpperCase('tr-TR')}** harfiyle baÅŸlamalÄ±.\n**â€¢** SÄ±ralamayÄ± ve istatistikleri gÃ¶rmek iÃ§in \`/sÄ±ralama\` yazabilirsin.`,
            /*fields: [
              {
                name: '**Â»** BaÄŸlantÄ±lar',
                value: `**â€¢** [Destek Sunucusu](https://discord.gg/VppTU9h) â€¢ [Davet BaÄŸlantÄ±sÄ±](${client.settings.invite})`,
              },
            ]*/
          }
        ]
      });

      //Son Kelime
      wordGame.lastWord = {
        word: kÃ¼Ã§Ã¼kHarfliKelime + yeniHarf,
        author: message.author.id
      };

    } else {

      //Son Kelime
      wordGame.lastWord = {
        word: kÃ¼Ã§Ã¼kHarfliKelime,
        author: message.author.id
      };

      //"AynÄ± harfi Ã§ok sÄ±k kullandÄ±nÄ±z" uyarÄ±sÄ±
      if (wordGame.history?.length) {
        const counts = {};
        const sampleArray = ((wordGame.history?.concat(wordGame.history || []))?.splice(0, 200) || []).slice(-6).map(word => word.slice(-1));
        sampleArray.forEach(async function (x) { counts[x] = (counts[x] || 0) + 1; });

        //Son 6 kelimenin 5'i aynÄ± harfle bitiyosa
        let sonHarf = kÃ¼Ã§Ã¼kHarfliKelime.slice(-1);
        let sonHarfinKullanÄ±mOranÄ± = (counts[sonHarf] || 0);

        if (sonHarfinKullanÄ±mOranÄ± >= 5) {
          let yeniHarf = makeid(1, sonHarf).toLocaleLowerCase('tr-TR');
          wordGame.lastWord = {
            word: kÃ¼Ã§Ã¼kHarfliKelime + yeniHarf,
            author: message.author.id
          };

          message.channel.send({
            embeds: [
              {
                color: client.settings.embedColors.default,
                author: {
                  name: 'Nraphy â€¢ Kelime Oyunu',
                  icon_url: client.settings.icon
                },
                title: `**Â»** Ne Bu SÃ¼rekli AynÄ± Harf?!`,
                description: `**â€¢** Bu yÃ¼zden bir sonraki sÃ¶zcÃ¼k **${yeniHarf.toLocaleUpperCase('tr-TR')}** harfiyle baÅŸlamalÄ±.\n**â€¢** SÄ±ralamayÄ± ve istatistikleri gÃ¶rmek iÃ§in \`/sÄ±ralama\` yazabilirsin.`,
              }
            ]
          });
        }
      }
    }

    //Database
    guildData.markModified('wordGame');
    if (!client.guildsWaitingForSync.includes(message.guild.id)) client.guildsWaitingForSync.push(message.guild.id);

    function makeid(length, exemptLetter = "") {
      var result = '';
      var characters = 'ABCÃ‡DEFGHÄ°IJKLMNOÃ–PRSÅ�TUÃœVYZ'.replace(exemptLetter?.toLocaleUpperCase('tr-TR'), '');
      var charactersLength = characters.length;
      for (var i = 0; i < length; i++) {
        result += characters.charAt(Math.floor(Math.random() *
          charactersLength));
      }
      return result;
    }

  } catch (err) { client.logger.error(err); }
};
