using Connected.Utilities;
using Microsoft.AspNetCore.Components;

namespace Connected.Components;
public partial class DatePicker
{
	private bool loaded = false;

	private Selecting Selecting = Selecting.Days;
	public DateTime calendarStart { get; set; }
	public DateTime calendarEnd { get; set; }

	//private DateTime Today = DateTime.Today;

	[Parameter]
	public bool CloseOnDateSelect { get; set; } = false;

	[Parameter]
	public DateTime Date { get; set;  } = DateTime.Today;

	[Parameter]
	public EventCallback<DateTime> DateChanged { get; set; }

	private List<DateTime> Dates = new List<DateTime>();

	[Parameter]
	public string Format { get; set; } = "dd.MM.yyyy";

	private bool _readonly = false;
	[Parameter]
	public bool Editable
	{
		get
		{
			return !_readonly;
		}
		set
		{
			_readonly = !value;
		}
	}
	private bool Shown { get; set; } = false;

	public async Task SetDate(DateTime Date)
	{
		this.Date = Date;
		SetStartStop();
		if (CloseOnDateSelect)
			Shown = false;
		await DateChanged.InvokeAsync(this.Date);
		StateHasChanged();
	}

	public async Task SetMonth(int month)
	{
		Date = new DateTime(Date.Year, month, Date.Day);
		Selecting = Selecting.Days;
		SetStartStop();
		await DateChanged.InvokeAsync(this.Date);
		StateHasChanged();
	}

	public async Task SetYear(int year)
	{
		Date = new DateTime(year, Date.Month, Date.Day);
		Selecting = Selecting.Months;
		SetStartStop();
		await DateChanged.InvokeAsync(this.Date);
		StateHasChanged();
	}

	private string DayNamesRowClass
	{
		get
		{
			return new CssBuilder()
				.AddClass("chip-leading-icon")
				.AddClass("d-inline-block")
				.AddClass("m-1")
				.AddClass("bg-danger")
				.AddClass("text-small")
				.AddClass("text-white")
				.Build();
		}
	}
	private string ChipFirstRowStyle
	{
		get
		{
			return new StyleBuilder()
				.AddStyle("width", "30px")
				.AddStyle("height", "30px")
				.AddStyle("text-align", "center")
				.Build();
		}
	}
	/*
	 @for (int i=0;i<7; i++)
            {
                <div class="chip-leading-icon d-inline-block p-1 bg-danger text-small text-light" style="width:30px; height:30px; text-align:center">@calendarStart.AddDays(i).ToString("ddd").Substring(0,1)</div>
            }
            @while (calendarStart.CompareTo(calendarEnd) < 0)
            {
                <a href="#" @onclick="@(()=>SetDate(calendarStart))"><div class="chip-leading-icon d-inline-block p-1 @ChipStyle(calendarStart)" style="width:30px; height:30px; text-align:center">@calendarStart.Day.ToString()</div></a>
                @if (calendarStart.DayOfWeek.Equals(DayOfWeek.Sunday))
                {
                    <br />
                }
                calendarStart = calendarStart.AddDays(1);
            } 
	 
	 */

	public void SetStartStop()
	{
		calendarStart = Date;
		while (calendarStart.Day != 1)
		{
			calendarStart = calendarStart.AddDays(-1);
		}
		while (!calendarStart.DayOfWeek.Equals(DayOfWeek.Monday))
		{
			calendarStart = calendarStart.AddDays(-1);
		}
		calendarEnd = Date;
		while (calendarEnd.Month == Date.Month)
		{
			calendarEnd = calendarEnd.AddDays(1);
		}
		while (!calendarEnd.DayOfWeek.Equals(DayOfWeek.Monday))
		{
			calendarEnd = calendarEnd.AddDays(1);
		}
		DateTime start = calendarStart;
		if (Dates is null) Dates = new();
		Dates.Clear();
		while (start.CompareTo(calendarEnd) < 0)
		{
			Dates.Add(start);
			start = start.AddDays(1);
		}
	}

	public string DateChipStyle(DateTime date)
	{
		string result = "";
		if (date.Month.CompareTo(Date.Month) < 0 || date.Month.CompareTo(Date.Month) > 0) return "bg-core text-light";
		if (date.CompareTo(DateTime.Today) == 0) result = "b-1 b-c-info";
		if (date.Month.CompareTo(Date.Month) == 0)
		{
			if (date.Date.CompareTo(Date.Date) == 0)
				return result+" bg-info text-light";
			else
				return result+" bg-core text-dark";
		}
		return result;
	}

	public string MonthChipClass(int month)
	{
		if (month.CompareTo(Date.Month) == 0)
			return "bg-info text-light";
		else
			return "bg-core text-dark";
	}

	public string YearChipClass(int year)
	{
		if (year.CompareTo(Date.Year) == 0)
			return "bg-info text-light";
		else
			return "bg-core text-dark";
	}

	protected override async Task OnInitializedAsync()
	{
		Date = DateTime.Today;
		SetStartStop();
		loaded = true;
		await base.OnInitializedAsync();
	}

	private string NavBarClass
	{
		get
		{
			return new CssBuilder("text-justify")
				.AddClass("text-md-justify")
				//.AddClass("bg-warning")
				.AddClass("text-small")
				.AddClass("text-dark")
				.Build();
		}
	}

}

public enum Selecting
{
	Days,
	Months,
	Years
}
