
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using UnityEngine;
using UnityEngine.UI;

public class QuizController : MonoBehaviour {

    public GameObject[] answers;

    public Text counterText;

    public Text scoreText;

    public Text questionText;

    public Button btnNextQuestion;

    private float counterValue;

    private const int numberOfAnswers = 4;

    private const int scoreCorrectAnswer = 10;

    private const int scoreIncorrectAnswer = -15;

    private const int scoreTimedOut = 0;

    private const int counterInitialValue = 10;

    private const int counterDisplayAnswersInitialValue = 3;

    private float counterDisplayAnswersValue;

    private bool counterDisplayAnswersStarted = false;

    private int scoreValue = 0;

    private int questionIdx = 0;

    private List<int> selectedAnswers;

    List<Question> questions = new List<Question>() {
            new Question("1. Neki od ovih prozora imaju 2-3 puta manje toplotnih gubitaka za razliku od drugih, koji su to?", new int[] {1, 4}), 
            new Question("2. Na jedan od načina možete uštedjeti i do 10 litara vode po osobi dnevno, uz koji predmet?", new int[] {3, 4}),
    };

    List<Question> q = new List<Question>()
    {
        new Question("3. Korištenjem jednog od sljedećih predmeta, u svjetlost se pretvara svega 5% uložene energije, dok se ostatak pretvara u toplotu, koji je to?", new int[] {1}),
        new Question("4. Neki od navedenih predmeta uključeni u utičnicu, iako nisu u u funkciji, i dalje se znatno griju i troše električnu energiju.", new int[] {3}),
        new Question("5. Šta možemo ugraditi na radijatore da nam pomogne smanjiti troškove grijanja za 7-15%?", new int[] {1, 3}),
        new Question("6. Ako je vani temperatura 33oC, koja je optimalna temperatura u kući? ", new int[] {4}),
        new Question("7. Kakvim načinom pranja posuđa, i uz koji uređaj od navedenih, trošimo 60% manje električne energije i do 85% manje vode?", new int[] {2, 3}),
        new Question("8. Koji uređaj u «stand by» načinu rada troši i do 24% energije u odnosu na potrošnju energije kada je upaljen?", new int[] {4}),
        new Question("9. Jednom godišnje stručna osoba treba provjeriti prohodnost čega? Loša prohodnost doprinosi većoj potrošnji energije za grijanje.", new int[] {1}),
        new Question("10. Uvijek odaberite program s najnižom temperaturom vode koji još uvijek obezbjeđuje dobar kvalitet pranja, za šta od navedenog? ", new int[] {1, 4}),
    };


    public GameObject objController;

    // Use this for initialization
    void Start () {
        selectedAnswers = new List<int>();
        counterValue = counterInitialValue;
        UpdateScene();
        UpdateCounter();
        UpdateScore();
        btnNextQuestion.GetComponent<Button>().onClick.AddListener(LoadNextQuestion);
        /*
        // Instantiate the wreck game object at the same position we are at
        GameObject wreckClone = (GameObject)Instantiate(objController, new Vector3(0, 2, -7), Quaternion.identity);

        // Sometimes we need to carry over some variables from this object
        // to the wreck
        wreckClone.GetComponent<ObjectController>().imageCorrect.enabled = true;
        wreckClone.GetComponent<ObjectController>().imageIncorrect.enabled = false;

        // Instantiate the wreck game object at the same position we are at
        GameObject wreckClone1 = (GameObject)Instantiate(objController, new Vector3(-5, 2, -7), Quaternion.identity);

        // Sometimes we need to carry over some variables from this object
        // to the wreck
        wreckClone1.GetComponent<ObjectController>().imageCorrect.enabled = false;
        wreckClone1.GetComponent<ObjectController>().imageIncorrect.enabled = true;

        //Instantiate(Resources.Load("Prefabs/AnswerGameObject") as GameObject, new Vector3(0, 2, -7), Quaternion.identity);*/
      
    }


    // Update is called once per frame
    void Update()
    {
        if (counterValue > 0)
        {
            counterValue -= Time.deltaTime;
            UpdateCounter();
        }

        else
        {
            LoadNextQuestion();
            counterValue = counterInitialValue;
        }

        if (counterDisplayAnswersValue > 0 && counterDisplayAnswersStarted)
            counterDisplayAnswersValue -= Time.deltaTime;
        else
        {
            UpdateScene();
            counterDisplayAnswersStarted = false;
        }
        

        if (Input.GetMouseButtonDown(0))
        {
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit hit;

            if (Physics.Raycast(ray, out hit, 100))
            {
                Debug.Log(hit.transform.gameObject.name);
                int answerIdx = GetAnswerIdx(hit.transform.gameObject.name) - numberOfAnswers * questionIdx;
                if (!selectedAnswers.Contains(answerIdx))
                    selectedAnswers.Add(answerIdx);
                else
                    selectedAnswers.Remove(answerIdx);
            }
        }
    }

    void LoadNextQuestion()
    {
        scoreValue += GetScore();
        UpdateScore();
        selectedAnswers.Clear();
        counterDisplayAnswersValue = counterDisplayAnswersInitialValue;
        counterDisplayAnswersStarted = true;
        ShowAnswers();
        questionIdx = (questionIdx + 1) % 2;
    }

    private void UpdateScore()
    {
        scoreText.text = scoreValue.ToString();
    }

    private void UpdateCounter()
    {
        counterText.text = counterValue.ToString("f0");
    }

    private void ShowAnswers()
    {
        for(int i = numberOfAnswers * questionIdx; i < numberOfAnswers * (questionIdx + 1); i++)
        {
            MarkAnswer(questions[questionIdx].getCorrectAnswers().Contains(i - questionIdx * numberOfAnswers + 1), i);
        }
    }

    private void MarkAnswer(bool isCorrect, int idx)
    {
        answers[idx].GetComponent<ObjectController>().imageCorrect.enabled = isCorrect;
        answers[idx].GetComponent<ObjectController>().imageIncorrect.enabled = !isCorrect;
    }

    // Update scene with new question + answers
    private void UpdateScene()
    {
        RemoveMarks();
        // Set new question
        questionText.text = questions[questionIdx].getQuestionText();
        // Set right answers
        for(int i = 0; i < answers.Length; i++)
        {
            if (i >= numberOfAnswers * questionIdx && i < numberOfAnswers * (questionIdx + 1))
            {
                answers[i].SetActive(true);
            }
            else
                answers[i].SetActive(false);
        }
    }

    private void RemoveMarks()
    {
        foreach(GameObject answer in answers)
        {
            answer.GetComponent<ObjectController>().imageCorrect.enabled = false;
            answer.GetComponent<ObjectController>().imageIncorrect.enabled = false;
        }
    }

    private int GetAnswerIdx(string gameObjName)
    {
        string resultString = Regex.Match(gameObjName, @"\d+").Value;
        return System.Int32.Parse(resultString);
    }

    private int GetScore() {
        // Didn't try
        if (selectedAnswers.Count == 0)
            return scoreTimedOut;
        // Correct answer
        if (selectedAnswers.SequenceEqual(new List<int>(questions[questionIdx].getCorrectAnswers())))
            return scoreCorrectAnswer;
        else
            return scoreIncorrectAnswer;

    }
}
