﻿using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using System.Collections.Generic;

namespace EasyCoppa
{
    public class EC_CanvasBuilder : MonoBehaviour
    {
        [SerializeField] private GameObject coppaInputBlocker = null;
        [SerializeField] private GameObject defaultInputBlocker = null;
        [SerializeField] private GameObject rejectionInputBlocker = null;

        [SerializeField] GameObject shortDropdownPrefab = null;
        [SerializeField] GameObject longDropdownPrefab = null;
        [SerializeField] Transform dropDownContainer = null;
        [SerializeField] GameObject eventSystem = null;

        [Header ("Localizable Labels")]
        [SerializeField] private Text COPPA_TITLE = null;
        [SerializeField] private Text COPPA_DESCRIPTION = null;
        [SerializeField] private Text COPPA_TERMS = null;
        [SerializeField] private Text COPPA_PRIVACY = null;
        [SerializeField] private Text COPPA_ACCEPT = null;
        [SerializeField] private Text DEFAULT_TITLE = null;
        [SerializeField] private Text DEFAULT_DESCRIPTION = null;
        [SerializeField] private Text DEFAULT_TERMS = null;
        [SerializeField] private Text DEFAULT_PRIVACY = null;
        [SerializeField] private Text DEFAULT_ACCEPT = null;
        [SerializeField] private Text REJECT_TITLE = null;
        [SerializeField] private Text REJECT_DESCRIPTION = null;
        [SerializeField] private Text REJECT_ACCEPT = null;

        private Dropdown dd_left;
        private Dropdown dd_middle;
        private Dropdown dd_right;

        private string appNamePlaceholder = "%APP_NAME%";
        private string companyNamePlaceholder = "%COMPANY_NAME%";
        private string supportMailPlaceholder = "%SUPPORT_MAIL%";

        #region Date fields content
        List<string> days = new List<string>
    {
        "DD",
        "01",
        "02",
        "03",
        "04",
        "05",
        "06",
        "07",
        "08",
        "09",
        "10",
        "11",
        "12",
        "13",
        "14",
        "15",
        "16",
        "17",
        "18",
        "19",
        "20",
        "21",
        "22",
        "23",
        "24",
        "25",
        "26",
        "27",
        "28",
        "29",
        "30",
        "31"
    };

        List<string> months = new List<string>
    {
        "MM",
        "01",
        "02",
        "03",
        "04",
        "05",
        "06",
        "07",
        "08",
        "09",
        "10",
        "11",
        "12"
    };

        List<string> years;
        #endregion

        public static EC_CanvasBuilder Instance { get; private set; }

        private void OnEnable()
        {
            EventSystem[] eventSystems = FindObjectsOfType<EventSystem>();
            if(eventSystems.Length > 1)
            {
                Destroy(eventSystem);
            }
        }

        private void Awake()
        {
            if (Instance != null)
                Destroy(this);
            else
                Instance = this;

            //Setup Input Blockers
            SetupInputBlockers();

            //Manage Localization
            CheckLocalization();

            //Fill an array of years from current year to 100 years in the past
            FillYearArray();

            //Instantiate the dropdown prefabs so they get centered in the panel
            CreateDateLayout();

            //Add the options for each dropdown
            AddDropdownOptions();
        }

        //Activate/Deactivate input blockers
        private void SetupInputBlockers()
        {
            bool shouldBlockInput = EC_Settings.ShouldBlockInput();

            coppaInputBlocker.SetActive(shouldBlockInput);
            defaultInputBlocker.SetActive(shouldBlockInput);
            rejectionInputBlocker.SetActive(shouldBlockInput);
        }

        //Replace placeholders for app name and company name
        private string FillInPlaceHolders(string text)
        {
            string result = text;

            result = result.Replace(appNamePlaceholder, Application.productName);
            result = result.Replace(companyNamePlaceholder, Application.companyName);
            result = result.Replace(supportMailPlaceholder, EC_Settings.GetSupportMail());

            return result;
        }

        //Fill an array of years from current year to 100 years in the past
        private void FillYearArray()
        {
            int currentYear = System.DateTime.Now.Year;
            int MAX_AGE = 100;
            string yearsHint = "YYYY";

            years = new List<string>();

            years.Add(yearsHint);

            for (int i = currentYear; i > (currentYear - MAX_AGE); i--)
            {
                years.Add(i.ToString());
            }
        }

        //Instantiate the dropdown prefabs so they get centered in the panel
        private void CreateDateLayout()
        {
            GameObject TmpDropdown;

            switch (EC_Settings.GetDateFormat())
            {
                case EC_Settings.DateFormat.DD_MM_YYYY:
                    TmpDropdown = Instantiate(shortDropdownPrefab, dropDownContainer);
                    dd_left = TmpDropdown.GetComponent<Dropdown>();

                    TmpDropdown = Instantiate(shortDropdownPrefab, dropDownContainer);
                    dd_middle = TmpDropdown.GetComponent<Dropdown>();

                    TmpDropdown = Instantiate(longDropdownPrefab, dropDownContainer);
                    dd_right = TmpDropdown.GetComponent<Dropdown>();
                    break;

                case EC_Settings.DateFormat.MM_DD_YYYY:
                    TmpDropdown = Instantiate(shortDropdownPrefab, dropDownContainer);
                    dd_left = TmpDropdown.GetComponent<Dropdown>();

                    TmpDropdown = Instantiate(shortDropdownPrefab, dropDownContainer);
                    dd_middle = TmpDropdown.GetComponent<Dropdown>();

                    TmpDropdown = Instantiate(longDropdownPrefab, dropDownContainer);
                    dd_right = TmpDropdown.GetComponent<Dropdown>();
                    break;

                case EC_Settings.DateFormat.YYYY_MM_DD:
                    TmpDropdown = Instantiate(longDropdownPrefab, dropDownContainer);
                    dd_left = TmpDropdown.GetComponent<Dropdown>();

                    TmpDropdown = Instantiate(shortDropdownPrefab, dropDownContainer);
                    dd_middle = TmpDropdown.GetComponent<Dropdown>();

                    TmpDropdown = Instantiate(shortDropdownPrefab, dropDownContainer);
                    dd_right = TmpDropdown.GetComponent<Dropdown>();
                    break;
            }

            EC_Dialog.SetUpDropdowns(dd_left, dd_middle, dd_right);
        }

        //Add the options for each dropdown
        private void AddDropdownOptions()
        {
            switch (EC_Settings.GetDateFormat())
            {
                case EC_Settings.DateFormat.DD_MM_YYYY:
                    dd_left.AddOptions(days);
                    dd_middle.AddOptions(months);
                    dd_right.AddOptions(years);
                    break;

                case EC_Settings.DateFormat.MM_DD_YYYY:
                    dd_left.AddOptions(months);
                    dd_middle.AddOptions(days);
                    dd_right.AddOptions(years);
                    break;

                case EC_Settings.DateFormat.YYYY_MM_DD:
                    dd_left.AddOptions(years);
                    dd_middle.AddOptions(months);
                    dd_right.AddOptions(days);
                    break;
            }
        }

        public void CheckLocalization()
        {
            if (EC_Settings.ShouldUseLocalization())
            {
                COPPA_TITLE.text = EC_Settings.Lang().EC_COPPA_TITLE;
                COPPA_DESCRIPTION.text = EC_Settings.Lang().EC_COPPA_DESCRIPTION;
                COPPA_TERMS.text = EC_Settings.Lang().EC_COMMON_TERMS;
                COPPA_PRIVACY.text = EC_Settings.Lang().EC_COMMON_PRIVACY;
                COPPA_ACCEPT.text = EC_Settings.Lang().EC_COMMON_ACCEPT;
                DEFAULT_TITLE.text = EC_Settings.Lang().EC_DEFAULT_TITLE;
                DEFAULT_DESCRIPTION.text = EC_Settings.Lang().EC_DEFAULT_DESCRIPTION;
                DEFAULT_TERMS.text = EC_Settings.Lang().EC_COMMON_TERMS;
                DEFAULT_PRIVACY.text = EC_Settings.Lang().EC_COMMON_PRIVACY;
                DEFAULT_ACCEPT.text = EC_Settings.Lang().EC_COMMON_ACCEPT;
                REJECT_TITLE.text = EC_Settings.Lang().EC_REJECT_TITLE;
                REJECT_DESCRIPTION.text = EC_Settings.Lang().EC_REJECT_DESCRIPTION;
                REJECT_ACCEPT.text = EC_Settings.Lang().EC_REJECT_ACCEPT;                
            }

            COPPA_TITLE.text = FillInPlaceHolders(COPPA_TITLE.text);
            COPPA_DESCRIPTION.text = FillInPlaceHolders(COPPA_DESCRIPTION.text);
            COPPA_TERMS.text = FillInPlaceHolders(COPPA_TERMS.text);
            COPPA_PRIVACY.text = FillInPlaceHolders(COPPA_PRIVACY.text);
            COPPA_ACCEPT.text = FillInPlaceHolders(COPPA_ACCEPT.text);
            DEFAULT_TITLE.text = FillInPlaceHolders(DEFAULT_TITLE.text);
            DEFAULT_DESCRIPTION.text = FillInPlaceHolders(DEFAULT_DESCRIPTION.text);
            DEFAULT_TERMS.text = FillInPlaceHolders(DEFAULT_TERMS.text);
            DEFAULT_PRIVACY.text = FillInPlaceHolders(DEFAULT_PRIVACY.text);
            DEFAULT_ACCEPT.text = FillInPlaceHolders(DEFAULT_ACCEPT.text);
            REJECT_TITLE.text = FillInPlaceHolders(REJECT_TITLE.text);
            REJECT_DESCRIPTION.text = FillInPlaceHolders(REJECT_DESCRIPTION.text);
            REJECT_ACCEPT.text = FillInPlaceHolders(REJECT_ACCEPT.text);
        }
    }
}
