using System.Collections;
using System.Collections.Generic;
using GUI_Scripts.ProceduralGeneration;
using UnityEngine;


/// <summary>
/// Note:
/// Wizard changing quest content after finishing second dialogue 
/// Before that prev gest stay in Quest list
/// </summary>
public enum WizzardMissionStateEnum
{
    None = 0,
    AcceptMission = 1,
    WaitingForPeoggress = 2,
    MainPlotIntroduction = 3
}

[RequireComponent(typeof(NPC))]
[RequireComponent(typeof(NpcMissionManager))]
public class WizardFirstQuestManager : MonoBehaviour
{
    private Rigidbody2D myRigidbody;
    public Animator anim;

    public Vector3 homePosition;
    public Transform targetPosition;

    public AStarPathfindingAgent agent;

    //public GameObject player;

    public bool approaching = false;
    //public bool isAfterAction = false;  //  after mission in this case
    public WizzardMissionStateEnum MissionProggress = WizzardMissionStateEnum.None;
    //public bool waitingForMissionEffects = false;
    public bool isDuringConversation = false;
    public float actionRadius = 1.5f;

    void Awake()
    {
        agent = GetComponent<AStarPathfindingAgent>();
    }

    // Start is called before the first frame update
    void Start()
    {
        gameObject.GetComponent<NpcMissionManager>().OpenInDefaultWay = false;


        myRigidbody = GetComponent<Rigidbody2D>();
        anim = GetComponent<Animator>();
        homePosition = new Vector3(gameObject.transform.position.x, gameObject.transform.position.y, gameObject.transform.position.z);
        targetPosition = GameObject.FindWithTag("Player").transform;


        if (PlayerPrefs.HasKey(gameObject.GetComponent<NPC>().name + ".FirstMission"))
            MissionProggress = (WizzardMissionStateEnum)PlayerPrefs.GetInt(gameObject.GetComponent<NPC>().name + ".FirstMission");


        // ODCZYTANIE STANU Z PlayerPrefs JEST NIEZPOJNE Z DANYMI ODCZYTYWANIYMI Z PLIKU O PROGRESSIE MISJI
        // Player Prefs zapisuje po kliknieciu buttona w dailogu
        // Mission & Quest - zapisuje po teleporcie albo recznym 'save'
        if (MissionProggress == WizzardMissionStateEnum.None)
            StartCoroutine(WaitBeforStartingAction(5f));
        else if (MissionProggress == WizzardMissionStateEnum.WaitingForPeoggress || MissionProggress == WizzardMissionStateEnum.MainPlotIntroduction)
        {
            approaching = false;

            gameObject.GetComponent<NPC>().State = NPCStateEnum.Talking;

            gameObject.GetComponent<NpcMissionManager>().OpenInDefaultWay = true;
        }

    }

    // Update is called once per frame
    public void Update()
    {
        HandleState();
    }

    private IEnumerator WaitBeforStartingAction(float waitTime)
    {
        while (true)
        {
            yield return new WaitForSeconds(waitTime);

            // Start story
            approaching = true;
            gameObject.GetComponent<NPC>().State = NPCStateEnum.Walking;
        }
    }

    private IEnumerator Wait(float waitTime)
    {
        while (true)
        {
            yield return new WaitForSeconds(waitTime);
        }
    }

    public void CheckDistance()
    {
        anim.SetBool("isRunning", true);
        StopAllCoroutines();

        //if (isAfterAction == false && waitingForMissionEffects == false)
        if (approaching && (MissionProggress == WizzardMissionStateEnum.None || MissionProggress == WizzardMissionStateEnum.AcceptMission))
        {
            if (approaching && Vector2.Distance(targetPosition.position, transform.position) >= actionRadius)
            {
                agent.FindPath();

                StartCoroutine(agent.FollowPath());

            }
            else if (approaching)
            {
                //start dialogue here
                gameObject.GetComponent<NpcMissionManager>().CanBeOpened = true;

                gameObject.GetComponent<NPC>().State = NPCStateEnum.Talking;
                if (targetPosition.position.y > transform.position.y)
                {
                    anim.SetBool("TurnFront", true);
                    anim.SetBool("isRunning", false);
                }
                else
                {
                    anim.SetBool("TurnFront", false);
                    anim.SetBool("isRunning", false);
                }
                agent.path.Clear(); // if we are able to talgk we dont want go go further player
            }
        }

        else if (MissionProggress == WizzardMissionStateEnum.WaitingForPeoggress)
        {
            if (Vector2.Distance(transform.position, homePosition) > 0.95)
            {
                //transform.position = Vector2.MoveTowards(transform.position, homePosition, 2 * Time.deltaTime);
                GoToHomePosition();
            }
            else
            {
                anim.SetBool("isRunning", false);
                anim.SetBool("TurnFront", false);
                gameObject.GetComponent<NPC>().State = NPCStateEnum.Pending;
            }
        }
        else if (MissionProggress == WizzardMissionStateEnum.MainPlotIntroduction)
        {
            gameObject.GetComponent<NPC>().State = NPCStateEnum.Talking;
            agent.path.Clear();
        }
    }

    public void OnTriggerExit2D(Collider2D other)
    {
        // don't listen when component is disabled
        if (!gameObject.GetComponent<WizardFirstQuestManager>().enabled || other.tag != "Player")
            return;

        if (gameObject.GetComponent<NpcMissionManager>().Mission != null && !gameObject.GetComponent<NpcMissionManager>().OpenInDefaultWay)
        {
            if (gameObject.GetComponent<NPC>().State == NPCStateEnum.Talking)
            {
                gameObject.GetComponent<NpcMissionManager>().Mission.BreakDialogueStep();
                isDuringConversation = false;
                gameObject.GetComponent<NPC>().State = NPCStateEnum.Walking;
            }

            // ... 
        }
    }

    public void HandleState()
    {
        switch (gameObject.GetComponent<NPC>().State)
        {
            case NPCStateEnum.Walking:
                {
                    CheckDistance();
                    break;
                }
            case NPCStateEnum.Talking:
                {
                    DoAction();
                    break;
                }
            case NPCStateEnum.Pending:
                {
                    break;
                }
            case NPCStateEnum.Attacking:
                {
                    break;
                }
            default:
                {
                    Debug.Log("fancy text nie wiem co zrobic");
                    break;
                }
        }
    }

    public void DoAction()
    {
        if (approaching == true && isDuringConversation == false && gameObject.GetComponent<NpcMissionManager>().CanBeOpened)
        {
            isDuringConversation = true;

            gameObject.GetComponent<NpcMissionManager>().Mission.StartDialogue();
        }
    }

    public void GoToHomePosition()
    {
        agent.point = homePosition;


        agent.FindPoint();

        StartCoroutine(agent.FollowPath());
    }


    public void AfterMissionAccepting()
    {
        var wizardOnScene = GameObject.FindGameObjectWithTag("NPCCollection").transform.Find("Wizard");

        if (wizardOnScene == null)
            return;

        //wizardOnScene.GetComponent<NPCFollowing>().isAfterAction = false;
        wizardOnScene.GetComponent<WizardFirstQuestManager>().approaching = false;
        //wizardOnScene.GetComponent<NPCFollowing>().waitingForMissionEffects = true;

        wizardOnScene.GetComponent<NPC>().State = NPCStateEnum.Walking;  // go home position

        wizardOnScene.GetComponent<NpcMissionManager>().OpenInDefaultWay = true;


        wizardOnScene.GetComponent<WizardFirstQuestManager>().MissionProggress = WizzardMissionStateEnum.WaitingForPeoggress;

        PlayerPrefs.SetInt(gameObject.GetComponent<NPC>().name + ".FirstMission", (int)wizardOnScene.GetComponent<WizardFirstQuestManager>().MissionProggress);
    }

    // tylko pierwszy - drugi nie bedzie
    public void AfterMeetingCondition()
    {
        var wizardOnScene = GameObject.FindGameObjectWithTag("NPCCollection").transform.Find("Wizard");

        if (wizardOnScene == null)
            return;

        approaching = false;

        //waitingForMissionEffects = false;

        //isAfterAction = true;

        wizardOnScene.GetComponent<WizardFirstQuestManager>().MissionProggress = WizzardMissionStateEnum.MainPlotIntroduction;

        PlayerPrefs.SetInt(gameObject.GetComponent<NPC>().name + ".FirstMission", (int)wizardOnScene.GetComponent<WizardFirstQuestManager>().MissionProggress);
    }
}