using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CluesGenerator : MonoBehaviour
{
    PhoneManager phoneManager;

    Dictionary<int, HashSet<int>> clues = new();

    public static CluesGenerator Instance;

    private void Awake()
    {
        Instance = this;
    }

    public void StartScenario(int scenarioIndex)
    {
        phoneManager = GetComponent<PhoneManager>();
        switch (scenarioIndex)
        {
            case 0:
                StartCoroutine(Scenario1());
                break;
            case 1:
                StartCoroutine(Scenario2());
                break;
            case 2:
                StartCoroutine(Scenario3());
                break;
            default:
                break;
        }
    }

    IEnumerator Scenario1()
    {
        yield return new WaitForSeconds(0.5f);
        phoneManager.ReceiveMessage("Nous avons besoin de vous pour neutraliser le criminel avant qu'il ne frappe.");
        yield return new WaitForSeconds(1f);
        phoneManager.ReceiveMessage("Le labo analyse les preuves. Nous vous les enverrons en temps voulu.");
        yield return new WaitForSeconds(3f);
        phoneManager.SendMessage("Je suis sur place, j'attends vos instructions.");
        yield return new WaitForSeconds(5f);
        phoneManager.ReceiveMessage($"On vient d'apprendre que son masque {GenerateRandomClue(0)} et {GenerateRandomClue(0)}.");
        yield return new WaitForSeconds(15f);
        phoneManager.ReceiveMessage($"Une source anonyme m'indique que le masque du criminel {GenerateRandomClue(0)}.");
        yield return new WaitForSeconds(10f);
        phoneManager.ReceiveMessage($"Le labo me dit que le criminel a été vu avec un masque qui {GenerateRandomClue(0)}.");
        yield return new WaitForSeconds(10f);
        phoneManager.ReceiveMessage($"Est-ce que ça va ?");
        yield return new WaitForSeconds(2f);
        phoneManager.SendMessage($"Pas vraiment, ma femme vient de me quitter...");
        yield return new WaitForSeconds(2f);
        phoneManager.ReceiveMessage($"Désolé d'entendre ça. Concentre-toi sur la mission.");
        yield return new WaitForSeconds(2f);
        phoneManager.ReceiveMessage($"On cherche un masque qui {GenerateRandomClue(0)} et {GenerateRandomClue(0)}.");
        yield return new WaitForSeconds(10f);
        phoneManager.ReceiveMessage($"Fais attention aux masques qui {GenerateRandomClue(0)}.");
    }

    IEnumerator Scenario2()
    {
        yield return new WaitForSeconds(0.5f);
        phoneManager.ReceiveMessage("Bravo pour votre travail !");
        yield return new WaitForSeconds(1f);
        phoneManager.ReceiveMessage("Malheureusement, un nouveau criminel s'apprête à frapper dans un bal étrangement familier.");
        yield return new WaitForSeconds(4f);
        phoneManager.ReceiveMessage($"Commencer par surveiller les masques qui {GenerateRandomClue(0)}");
        yield return new WaitForSeconds(3f);
        phoneManager.SendMessage("À propos de ma femme, elle a disparu.");
        yield return new WaitForSeconds(4f);
        phoneManager.ReceiveMessage("LA MISSION!! CONCENTRE TOI SUR LA MISSION!");
        yield return new WaitForSeconds(3f);
        phoneManager.ReceiveMessage($"Je viens de recevoir de nouvelles informations.");
        yield return new WaitForSeconds(3f); //20
        phoneManager.SendMessage("Concernant Giselle ?");
        yield return new WaitForSeconds(5f);
        phoneManager.ReceiveMessage($"Non, concernant le tueur, Roger concentre toi.");
        yield return new WaitForSeconds(2f);
        phoneManager.ReceiveMessage($"Le labo m'indique que le criminel porte un masque qui {GenerateRandomClue(0)}.");
        yield return new WaitForSeconds(3f); //30
        phoneManager.ReceiveMessage($"Est-ce que tu as une piste ?");
        yield return new WaitForSeconds(3f);
        phoneManager.SendMessage("Elle a du rentrer chez ses parents pour le weekend.");
        yield return new WaitForSeconds(5f);
        phoneManager.ReceiveMessage($"Bien reçu.");
        yield return new WaitForSeconds(3f);
        phoneManager.ReceiveMessage($"Ok on a du nouveau. Tiens toi prêt.");
        yield return new WaitForSeconds(2f);
        phoneManager.ReceiveMessage($"Le tueur a été vu avec un masque qui {GenerateRandomClue(0)}.");
        yield return new WaitForSeconds(2f);
        string clue = GenerateRandomClue(0);
        phoneManager.ReceiveMessage($"Le tueur a été vu avec un masque qui {clue}.");
        yield return new WaitForSeconds(2f);
        phoneManager.SendMessage($"Ma femme aussi avait un masque qui {clue}.");
        yield return new WaitForSeconds(5f);
        phoneManager.ReceiveMessage($"Concentre toi sur la mission Roger.");
        yield return new WaitForSeconds(2f);
        phoneManager.ReceiveMessage($"Est-ce que tu vois un masque qui {GenerateRandomClue(0)} ?");
        yield return new WaitForSeconds(3f); //60
        phoneManager.SendMessage("Je lui avait acheté lors de notre nuit de noce.");
        yield return new WaitForSeconds(3f);
        phoneManager.ReceiveMessage($"On vient de confirmer que le masque {GenerateRandomClue(0)}.");
        yield return new WaitForSeconds(2f);
        phoneManager.SendMessage("Tu crois que je devrais la rappeler ?");
        yield return new WaitForSeconds(4f);
        phoneManager.ReceiveMessage($"Non. Cherche un masque qui {GenerateRandomClue(0)} et {GenerateRandomClue(0)}.");
    }

    IEnumerator Scenario3()
    {
        bool isMichelDead = false;
        bool isJeanDead = false;

        yield return new WaitForSeconds(0.5f);
        phoneManager.ReceiveMessage("Félicitations pour avoir arrêté le criminel.");
        yield return new WaitForSeconds(2f);
        phoneManager.ReceiveMessage("Nous avons une nouvelle mission pour vous. Cette fois-ci nous avons 2 criminels en liberté");
        yield return new WaitForSeconds(2f);
        phoneManager.ReceiveMessage("Appelons le premier Jean et le deuxième Michel.");
        yield return new WaitForSeconds(3f);
        phoneManager.SendMessage("Pourquoi pas Philippe et Marie ?");
        yield return new WaitForSeconds(5f);
        phoneManager.ReceiveMessage($"Commence par surveiller les masques qui {GenerateRandomClue(0)} pour Jean et ceux qui {GenerateRandomClue(1)} pour Michel.");
        yield return new WaitForSeconds(5f);
        phoneManager.ReceiveMessage($"Le labo m'indique que Jean porte un masque qui {GenerateRandomClue(0)} et {GenerateRandomClue(0)}.");
        yield return new WaitForSeconds(5f);
        phoneManager.ReceiveMessage($"Michel porte un masque qui {GenerateRandomClue(1)} et {GenerateRandomClue(1)}.");
        yield return new WaitForSeconds(15f);

        if (GameManager.Instance.GetKiller(0).isDead && !isJeanDead)
        {
            isJeanDead = true;
            phoneManager.SendMessage("Jean vient de tomber.");
            yield return new WaitForSeconds(3f);
            phoneManager.ReceiveMessage($"Bien reçu. Restez vigilant pour Michel.");
            yield return new WaitForSeconds(2f);
        }
        if (GameManager.Instance.GetKiller(1).isDead && !isMichelDead)
        {
            isMichelDead = true;
            phoneManager.SendMessage("Michel vient de tomber.");
            yield return new WaitForSeconds(3f);
            phoneManager.ReceiveMessage($"Bien reçu. Restez vigilant pour Jean.");
            yield return new WaitForSeconds(2f);
        }

        if (!isJeanDead)
        {
            phoneManager.ReceiveMessage($"Jean porte un masque qui {GenerateRandomClue(0)}.");
            yield return new WaitForSeconds(2f);
        }
        if (!isMichelDead)
        {
            phoneManager.ReceiveMessage($"On vient de confirmer que le masque de Michel {GenerateRandomClue(1)}.");
        }

        yield return new WaitForSeconds(10f);

        if (GameManager.Instance.GetKiller(0).isDead && !isJeanDead)
        {
            isJeanDead = true;
            phoneManager.SendMessage("Jean vient de tomber.");
            yield return new WaitForSeconds(3f);
            phoneManager.ReceiveMessage($"Bien reçu. Restez vigilant pour Michel.");

            yield return new WaitForSeconds(2f);
        }
        if (GameManager.Instance.GetKiller(1).isDead && !isMichelDead)
        {
            isMichelDead = true;
            phoneManager.SendMessage("Michel vient de tomber.");
            yield return new WaitForSeconds(3f);
            phoneManager.ReceiveMessage($"Bien reçu. Restez vigilant pour Jean.");
            yield return new WaitForSeconds(2f);
        }

        if (!isJeanDead)
        {
            phoneManager.ReceiveMessage($"On vient de confirmer que le masque de Jean {GenerateRandomClue(0)}.");
            yield return new WaitForSeconds(2f);
        }
        if (!isMichelDead)
        {
            phoneManager.ReceiveMessage($"Michel porte un masque qui {GenerateRandomClue(1)}.");
        }

        yield return new WaitForSeconds(10f);

        if (GameManager.Instance.GetKiller(0).isDead && !isJeanDead)
        {
            isJeanDead = true;
            phoneManager.SendMessage("Jean vient de tomber.");
            yield return new WaitForSeconds(3f);
            phoneManager.ReceiveMessage($"Bien reçu. Restez vigilant pour Michel.");

            yield return new WaitForSeconds(2f);
        }
        if (GameManager.Instance.GetKiller(1).isDead && !isMichelDead)
        {
            isMichelDead = true;
            phoneManager.SendMessage("Michel vient de tomber.");
            yield return new WaitForSeconds(3f);
            phoneManager.ReceiveMessage($"Bien reçu. Restez vigilant pour Jean.");
            yield return new WaitForSeconds(2f);
        }

        if (!isJeanDead)
        {
            phoneManager.ReceiveMessage($"Le masque de Jean {GenerateRandomClue(0)} et {GenerateRandomClue(0)}.");
            yield return new WaitForSeconds(2f);
        }
        if (!isMichelDead)
        {
            phoneManager.ReceiveMessage($"le masque de Michel {GenerateRandomClue(1)} et {GenerateRandomClue(1)}.");
        }
        yield return new WaitForSeconds(3f);

        phoneManager.SendMessage($"Ralentissez, j'ai un peu la tête ailleurs.");
        yield return new WaitForSeconds(3f);
        phoneManager.ReceiveMessage($"D'accord, prenez votre temps.");
        yield return new WaitForSeconds(20f);
        if (GameManager.Instance.GetKiller(0).isDead && !isJeanDead)
        {
            isJeanDead = true;
            phoneManager.SendMessage("Jean vient de tomber.");
            yield return new WaitForSeconds(3f);
            phoneManager.ReceiveMessage($"Bien reçu. Restez vigilant pour Michel.");

            yield return new WaitForSeconds(2f);
        }
        if (GameManager.Instance.GetKiller(1).isDead && !isMichelDead)
        {
            isMichelDead = true;
            phoneManager.SendMessage("Michel vient de tomber.");
            yield return new WaitForSeconds(3f);
            phoneManager.ReceiveMessage($"Bien reçu. Restez vigilant pour Jean.");
            yield return new WaitForSeconds(2f);
        }
        yield return new WaitForSeconds(20f);
        if (GameManager.Instance.GetKiller(0).isDead && !isJeanDead)
        {
            isJeanDead = true;
            phoneManager.SendMessage("Jean vient de tomber.");
            yield return new WaitForSeconds(3f);
            phoneManager.ReceiveMessage($"Bien reçu. Restez vigilant pour Michel.");

            yield return new WaitForSeconds(2f);
        }
        if (GameManager.Instance.GetKiller(1).isDead && !isMichelDead)
        {
            isMichelDead = true;
            phoneManager.SendMessage("Michel vient de tomber.");
            yield return new WaitForSeconds(3f);
            phoneManager.ReceiveMessage($"Bien reçu. Restez vigilant pour Jean.");
            yield return new WaitForSeconds(2f);
        }
    }
    

    int GetRandomUnusedFeature(int index)
    {
        int feature = Random.Range(0, 11);
        int tryCount = 0;
        if (!clues.ContainsKey(index))
        {
            clues[index] = new HashSet<int>();
        }

        while (clues[index].Contains(feature) && tryCount < 100)
        {
            feature = Random.Range(0, 11);
            tryCount++;
        }
        clues[index].Add(feature);
        return feature;
    }

    string GenerateRandomClue(int index)
    {
        CharacterInfo killer = GameManager.Instance.GetKiller(index);
        MaskProperties mask = killer.maskProperties;

        int randomFeature = GetRandomUnusedFeature(index);

        switch (randomFeature)
        {
            case 0:
                if (mask.coverEyes)
                    return "lui couvre les yeux";
                else
                    return "ne lui couvre pas les yeux";
            case 1:
                if (mask.coverMouth)
                    return "lui couvre la bouche";
                else
                    return "ne lui couvre pas la bouche";
            case 2:
                if (mask.coverNose)
                    return "lui couvre le nez";
                else
                    return "ne lui couvre pas le nez";
            case 3:
                if (mask.coverHair)
                    return "lui couvre les cheveux";
                else
                    return "ne lui couvre pas les cheveux";
            case 4:
                if (mask.hasRed)
                    return "contient du rouge";
                else
                    return "ne contient pas de rouge";
            case 5:
                if (mask.hasBlack)
                    return "contient du noir";
                else
                    return "ne contient pas de noir";
            case 6:
                if (mask.hasWhite)
                    return "contient du blanc";
                else
                    return "ne contient pas de blanc";
            case 7:
                if (mask.hasBlue)
                    return "contient du bleu";
                else
                    return "ne contient pas de bleu";
            case 8:
                if (mask.hasGreen)
                    return "contient du vert";
                else
                    return "ne contient pas de vert";
            case 9:
                if (mask.isSolid)
                    return "est solide";
                else
                    return "est en tissu";
            case 10:
                if (mask.isFuturistic)
                    return "a un design futuristique";
                else
                    return "n'a pas un design futuristique";
        }

        return "";
    }
}
