using Mirea.Api.Endpoint.Configuration.Validation.Attributes;
using Mirea.Api.Endpoint.Configuration.Validation.Interfaces;
using System;
using System.Collections.Generic;
using System.Linq;

namespace Mirea.Api.Endpoint.Configuration.Model.GeneralSettings;

[RequiredSettings]
public class ScheduleSettings : IIsConfigured
{
    public struct PairPeriodTime
    {
        public TimeOnly Start { get; set; }
        public TimeOnly End { get; set; }

        public PairPeriodTime(TimeOnly t1, TimeOnly t2)
        {
            if (t1 > t2)
            {
                Start = t2;
                End = t1;
            }
            else
            {
                Start = t1;
                End = t2;
            }
        }

        public PairPeriodTime(Dto.Common.PairPeriodTime time) : this(time.Start, time.End) { }
    }

    public record struct CronUpdateSkip
    {
        public DateOnly? Start { get; set; }
        public DateOnly? End { get; set; }
        public DateOnly? Date { get; set; }

        public CronUpdateSkip(DateOnly d1, DateOnly d2)
        {
            if (d1 > d2)
            {
                Start = d2;
                End = d1;
            }
            else
            {
                Start = d1;
                End = d2;
            }
        }

        public CronUpdateSkip(DateOnly d1) => Date = d1;
    }

    public required string CronUpdateSchedule { get; set; }
    public DateOnly StartTerm { get; set; }
    public required IDictionary<int, PairPeriodTime> PairPeriod { get; set; }
    public List<CronUpdateSkip> CronUpdateSkipDateList { get; set; } = [];

    public bool IsConfigured()
    {
        return !string.IsNullOrEmpty(CronUpdateSchedule) &&
               StartTerm != default &&
               PairPeriod.Count != 0 &&
               PairPeriod.Any();
    }
}