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

[Serializable]
public class DialogueController
{
    public Queue<DialogueModel> listOfDialogue = new Queue<DialogueModel>();

    private UnityEvent EndOfDialogueStepAction = new UnityEvent();

    [SerializeField]
    public GameObject CurrentPanel;

    /// <summary>
    /// Set panel info (panel, coords, text, buttons)
    /// </summary>
    /// <param name="dialogueModel"></param>
    public void AddSentence(DialogueModel dialogueModel)
    {
        listOfDialogue.Enqueue(dialogueModel);
    }

/*    
 *   TODO add endpoints to setup button sctions via others scripyts ! ! ! 
    public void AddButton(PanelButtonStepModel _buttonModel)
    {
        Buttons.Add(_buttonModel);
    }

    public void SetButtons(List<PanelButtonStepModel> _buttonsModelList)
    {
        Buttons = _buttonsModelList;
    }
*/


    public void SetActionAfterDialogueEnds(UnityEvent _endOfDialogueStepAction)
    {
        EndOfDialogueStepAction = _endOfDialogueStepAction;
    }
    public void SetActionAfterDialogueEnds(Action _finishDialogueAction)
    {
        EndOfDialogueStepAction.AddListener( new UnityAction( _finishDialogueAction));
    }

    public void Show(DialogueModel panelModel)
    {
        Panel panelDis = panelModel.Panel(panelModel.Header, panelModel);
        panelDis.PanelInstance = panelDis.BuildPanel();

        if(!(panelDis is QuestionPanel))
            panelDis.SetContinueButtonAction(ShowNextPanel, this);

        CurrentPanel = panelDis.PanelInstance;
    }

    /// <summary>
    /// Return false if there was no more 'sentences' in current 'step'
    /// </summary>
    /// <param name="parentDialController"></param>
    /// <returns></returns>
    public bool ShowNextPanel(DialogueController parentDialController)
    {
        if (listOfDialogue.Count == 0)
        {
            FinishCurrentDialogue(parentDialController);

            return false;
        }
        else
        {
            MonoBehaviour.Destroy(parentDialController.CurrentPanel);

            DialogueModel nextPanel = parentDialController.listOfDialogue.Dequeue();

            Show(nextPanel);
        }

        return true;
    }

    /// <summary>
    /// Function to close currently opened panel
    /// And invoke final actions
    /// </summary>
    /// <param name="parentDialController"></param>
    public void FinishCurrentDialogue(DialogueController parentDialController)
    {
        CloseCurrentPanel(parentDialController);
        FinishDialoguStep();
    }

    public void CloseCurrentPanel(DialogueController parentDialController)
    {
        MonoBehaviour.Destroy(parentDialController.CurrentPanel);
    }

    public void CloseCurrentPanel()
    {
        MonoBehaviour.Destroy(CurrentPanel);
    }

    // if palyer click last dialogue panel's "continue" button then ShowNextPanel
    // function invoke this method whioch contain external action :D - MAGIC
    public void FinishDialoguStep()
    {
        // set uoe everything whats is needed to change after finish dialogue
        // eg.
        // - add task to list
        // - get reward
        // - mark quest as completed :D

        EndOfDialogueStepAction.Invoke();
    }
}