using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Utility;

/// <summary>
/// Macht genau das was man erwartet: Schaltet je nach Uhrzeit alle Kinder an oder aus.
/// </summary>
public class Zeitschaltuhr : MonoBehaviour, ISerializationCallbackReceiver
{
    private TimeSpan _turnOnTimeSpan;
    private TimeSpan _turnOffTimeSpan;
    
    public bool IsOn;
    
    [SerializeField] private SimpleTime _turnOnTime;
    [SerializeField] private SimpleTime _turnOffTime;
    
    public SimpleTime TurnOnTime
    {
        get => _turnOnTime;
        set
        {
            _turnOnTime = value;
            _turnOnTimeSpan = _turnOnTime.ToTimeSpan();
        }
    }

    public SimpleTime TurnOffTime
    {
        get => _turnOffTime;
        set
        {
            _turnOffTime = value;
            _turnOffTimeSpan = _turnOffTime.ToTimeSpan();
        }
    }

    void Start()
    {
        UpdateOn();
    }
    
    void Update()
    {
        UpdateOn();
    }

    void UpdateOn()
    {
        if (_turnOnTimeSpan < _turnOffTimeSpan)
        {
            // beide Zeiten am selben Tag
            
            bool wasOn = IsOn;
            
            IsOn = TimeManager.Instance.TimeOfDay.IsBetween(_turnOnTimeSpan, _turnOffTimeSpan);

            if (IsOn != wasOn)
            {
                UpdateChildren();
            }
        }
        else
        {
            // Zeiten über Mitternacht
            
            bool wasOn = IsOn;
            
            IsOn = !TimeManager.Instance.TimeOfDay.IsBetween(_turnOffTimeSpan, _turnOnTimeSpan);

            if (IsOn != wasOn)
            {
                UpdateChildren();
            }
        }
    }

    void UpdateChildren()
    {
        for (int i = 0; i < transform.childCount; i++)
        {
            transform.GetChild(i).gameObject.SetActive(IsOn);
        }
    }

    public void OnBeforeSerialize()
    {
    }

    public void OnAfterDeserialize()
    {
        _turnOnTimeSpan = _turnOnTime.ToTimeSpan();
        _turnOffTimeSpan = _turnOffTime.ToTimeSpan();
    }
}
