@tool
extends Main
class_name MainTablet

const BgColors = {
	"standart": Color("22262d"),
	"busy": Color("4e0003"),
	"free": Color("003c18"),
	"temporarily_free": Color("3a2c00")
}
const MinutesForTemporarilyFree := 15

enum Status {
	FREE,
	BUSY
}

@onready var _reservation_repo : AbstractReservationRepo = $Repos/Reservation
@onready var _reservation_service : ReservationService = $Services/ReservationService

@export var current_page : Pages:
	set(value):
		current_page = value
		load_page(value, false)

@onready var _pages := {
	Pages.Board: $Left/Pages/Board,
	Pages.ReservationCreation: $Left/Pages/ReservationCreation,
	Pages.ReservationEdit: $Left/Pages/ReservationEdit,
	Pages.TimeSetting: $Left/Pages/TimeSetting
}
@onready var _time_status_indent := $Left/TimeStatusContainer/Indent
@onready var _time_label := $Left/TimeStatusContainer/TimeLabel
@onready var _status_label := $Left/TimeStatusContainer/StatusLabel
@onready var _background := $Background

@onready var _create_reservation_button := $RightBottom/CreateReservationButton
@onready var _15_min_button := $Left/TimeStatusContainer/ReserveNowBox/InstantButtons/_15min
@onready var _30_min_button := $Left/TimeStatusContainer/ReserveNowBox/InstantButtons/_30min
@onready var _45_min_button := $Left/TimeStatusContainer/ReserveNowBox/InstantButtons/_45min
@onready var _1_hour_button := $Left/TimeStatusContainer/ReserveNowBox/InstantButtons/_1h

var _current_page := Pages.Board
var _previous_page : Pages
var _status : Status

func _ready():
	initialize_signals()

func initialize_signals():
	_create_reservation_button.pressed.connect(_on_create_reservation_button_pressed)
	_15_min_button.pressed.connect(_on_15_min_button_pressed)
	_30_min_button.pressed.connect(_on_30_min_button_pressed)
	_45_min_button.pressed.connect(_on_45_min_button_pressed)
	_1_hour_button.pressed.connect(_on_1_hour_button_pressed)

func _process(delta):
	_process_time_status_indent()

	var time = Time.get_time_dict_from_system()
	_process_time(time)
	_process_status(time)

func _process_time_status_indent():
	var indent = get_viewport_rect().size.y/3
	if _get_time_status_indent() != indent:
		_set_time_status_indent(indent)

func _process_time(time):
	_time_label.text = "%02d:%02d" % [time.hour, time.minute]

func _process_status(time):
	var reservations = _reservation_repo.list_reservations()
	var current_time_in_minutes = time.hour*60 + time.minute

	for reservation in reservations:
		var start_time_in_minutes = reservation.start_time.hours*60 + reservation.start_time.minutes
		var finish_time_in_minutes = reservation.finish_time.hours*60 + reservation.finish_time.minutes

		if current_time_in_minutes >= start_time_in_minutes \
		and current_time_in_minutes < finish_time_in_minutes:
			_status = Status.BUSY
			_status_label.text = "Занято"
			_background.color = BgColors.busy
			return

		elif current_time_in_minutes <= start_time_in_minutes \
		and current_time_in_minutes + MinutesForTemporarilyFree > start_time_in_minutes:
			_status = Status.FREE
			_status_label.text = "Свободно"
			_background.color = BgColors.temporarily_free
			return

	if len(reservations) > 0:
		_status = Status.FREE
		_status_label.text = "Свободно"
		_background.color = BgColors.free
	else:
		_status = Status.FREE
		_status_label.text = "Свободно"
		_background.color = BgColors.standart

func get_current_page():
	return _current_page

func load_page(value, with_update=true):
	_pages[_current_page].visible = false

	if _previous_page != _current_page:
		if not _current_page == Pages.TimeSetting:
			_previous_page = _current_page

	_current_page = value
	if with_update:
		_pages[_current_page].update()
	_pages[_current_page].visible = true

	return _pages[_current_page]

func go_to_previous_page(with_update=true):
	if _previous_page != null:
		load_page(_previous_page, with_update)

func get_reservation_repo() -> AbstractReservationRepo:
	return _reservation_repo

func get_reservation_service() -> ReservationService:
	return _reservation_service

func _set_time_status_indent(value):
	_time_status_indent.custom_minimum_size.y = value

func _get_time_status_indent():
	return _time_status_indent.custom_minimum_size.y

func _create_default_reservation(minutes_of_reservation):
	if _status == Status.BUSY:
		return

	var datetime = Time.get_datetime_dict_from_system()
	var start_time_in_minutes = datetime.hour * 60 + datetime.minute
	var finish_time_in_minutes = start_time_in_minutes + minutes_of_reservation
	var finish_time_hours = floor(finish_time_in_minutes/60)
	var finish_time_minutes = finish_time_in_minutes - finish_time_hours * 60

	if get_reservation_service().is_time_busy(start_time_in_minutes, finish_time_in_minutes):
		return

	var dto = CreateReservationDTO.new()
	dto.title = ""
	dto.date = "%02d.%02d.%04d" % [datetime.day, datetime.month, datetime.year]
	dto.start_time = {"hours": datetime.hour, "minutes": datetime.minute}
	dto.finish_time = {"hours": finish_time_hours, "minutes": finish_time_minutes}
	dto.creator = ""
	dto.room_id = "" # TODO: make it listbox
	dto.description = ""
	dto.color = randi_range(1, 3)

	var repo = get_reservation_repo()
	repo.create_reservation(dto)

	dto.queue_free()

	load_page(Main.Pages.Board, true)

func _on_create_reservation_button_pressed():
	load_page(Pages.ReservationCreation)

func _on_15_min_button_pressed():
	_create_default_reservation(15)

func _on_30_min_button_pressed():
	_create_default_reservation(30)

func _on_45_min_button_pressed():
	_create_default_reservation(45)

func _on_1_hour_button_pressed():
	_create_default_reservation(60)