using System;
using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using UnityEngine;
namespace Bitsplash.DatePicker
{
    /// 
    /// shows the week day names on top the date picker
    /// 
    [ExecuteInEditMode]
    public class DayTitle : DatePickerElement , IDatePickerSettingsItem
    {
        public string EditorTitle { get { return "Day Title"; } }
        public DatePickerCell CellPrefab;
        public string Format = "ddd";
        DatePickerContent mContent;
        bool mInvalid = true;
        public int Order { get { return 8; } }
        void GenerateCells()
        {
            Clear();
            if (CellPrefab == null || mContent == null)
                return;
            float ColumnSize = 1f / 7f;
            DateTime baseDate = DateTime.Today.Date;
            int monthDayOfWeek = (int)baseDate.DayOfWeek;
            int span = monthDayOfWeek - (int)mContent.FirstDayOfWeek;
            if (span < 0)
                span += 7;
            DateTime startFrom = (baseDate - TimeSpan.FromDays(span)).Date;
            for (int i = 0; i < 7; i++)
            {
                DateTime current = startFrom.Add(TimeSpan.FromDays(i)).Date;
                float startX = ((float)i) / 7f;
                if (mContent.RightToLeft)
                    startX = 1f - startX - ColumnSize;
                float endX = startX + ColumnSize;
                GameObject newObj = GameObject.Instantiate(CellPrefab.gameObject, transform);
                CommonMethods.SafeDestroy(newObj.GetComponent());
                CommonMethods.HideObject(newObj);
                newObj.name = String.Format("day_{0}", i);
                newObj.SetActive(true);
                CommonMethods.EnsureComponent(newObj);
                var rect = newObj.GetComponent();
                rect.anchorMin = new Vector2(startX, 0f);
                rect.anchorMax = new Vector2(endX, 1f);
                rect.anchoredPosition = new Vector2(0f, 0f);
                rect.sizeDelta = new Vector2(0f, 0f);
                var cell = newObj.GetComponent();
                cell.SetInitialSettings(true, false);
                cell.DayValue = current;
                try
                {
                    cell.SetText(current.ToString(Format));
                }
                catch(Exception)
                {
                    Debug.LogWarning("invalid format in day title");
                }                 
            }
        }
        public void Clear()
        {
            IDateTimeItem[] children = GetComponentsInChildren();
            for (int i = 0; i < children.Length; ++i)
            {
                if (children[i] != null)
                {
                    if (children[i].gameObject.GetComponentInParent() != this)
                        continue;
                    if (children[i].gameObject != gameObject)
                        CommonMethods.SafeDestroy(children[i].gameObject);
                }
            }
        }
        public void Invalidate()
        {
            mInvalid = true;
        }
        public override void OnValidate()
        {
            base.OnValidate();
            Invalidate();
        }
        // Start is called before the first frame update
        protected override void Start()
        {
            base.Start();
            Invalidate();
        }
        protected override void OnSettingsChanged()
        {
            base.OnSettingsChanged();
            Invalidate();
        }
        // Update is called once per frame
        void Update()
        {
            if(mInvalid == true)
            {
                mInvalid = false;
                GenerateCells();
            }
        }
        protected override void SetContent(DatePickerContent content)
        {
            mContent = content;
            Invalidate();
        }
        protected override void SetMain(DatePickerSettings main)
        {
        }
    }
}