package com.example.schedulerapp;

import javafx.geometry.HPos;
import javafx.geometry.Pos;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.GridPane;

import java.util.ArrayList;
import java.util.Arrays;

public class WeeklyView extends GridPane implements ModelSubscriber{
    Model model;
    ArrayList<Label> times;
    ArrayList<Label> days;

    public WeeklyView(){
        //list of time labels
        times = new ArrayList<>();
        for (int i = 8; i < 24; i++){
            String j = i + "00";
            String k = i + "30";
            if (i < 10) {
                j = "0" + j;
                k = "0" + k;
            }
            Label jLabel = new Label(j);
            Label kLabel = new Label(k);
            times.add(jLabel);
            times.add(kLabel);
        }
        for (Label label : times){
            label.setPrefHeight(20);
            //label.setStyle(" -fx-border-color: black");
        }

        //list of day labels
        days = new ArrayList<>();
        days.addAll(Arrays.asList(new Label("Sunday"), new Label("Monday"), new Label("Tuesday"),
                new Label("Wednesday"), new Label("Thursday"), new Label("Friday"), new Label("Saturday")));

        for (Label label : days){
            GridPane.setHalignment(label, HPos.CENTER);
            label.setAlignment(Pos.CENTER);
            label.setPrefWidth(80);
            //label.setStyle(" -fx-border-color: black");
        }
    }

    public void setModel(Model newModel) {
        this.model = newModel;
        //now can draw for first time
        draw();
    }

    @Override
    public void modelChanged() {
        draw();
    }

    public void draw(){
        //clear
        this.getChildren().clear();

        //add to gridpane - time axis never changes
        int i = 1;
        for (Label time : times){
            this.add(time, 0, i);
            i++;
        }

        //add to gridpane - day axis never changes
        i = 1;
        for (Label time : days){
            this.add(time, i, 0);
            i++;
        }

        int col;        //depends on day of week
        int row;        //depends on start time
        int length;     //depends on end time - start time

        //get updated schedule
        ArrayList<Shift> schedule = model.getWeeklySchedule();

        for (Shift shift : schedule){
            col = (shift.getStart().getDayOfWeek().getValue() % 7) + 1; //need Sunday=7 to be 1

            //convert from start time to offset, granularity in 30 min increments
            row = (shift.getStart().getHour() - 8 ) * 2 + 1;
            if (shift.getStart().getMinute() == 30) row++;
            //calculate length
            length = (shift.getEnd().getHour() - shift.getStart().getHour()) * 2;
            if (shift.getStart().getMinute() == 30) length--;
            if (shift.getEnd().getMinute() == 30) length++;

            //text formatting
            String text;
            if (shift.getStart().getHour() < 10) text = "0" + shift.getStart().getHour();
            else text = String.valueOf(shift.getStart().getHour());
            if (shift.getStart().getMinute() == 0) text += "00";
            else text += "30";      //only two options for minutes
            text += "\n   -   \n";
            if (shift.getEnd().getHour() < 10) text += "0" + shift.getEnd().getHour();
            else text += String.valueOf(shift.getEnd().getHour());
            if (shift.getEnd().getMinute() == 0) text += "00";
            else text += "30";      //only two options for minutes

            Button shiftRep = new Button(text);
            shiftRep.setMaxHeight(700);                 //so it always fills its region
            shiftRep.setMaxWidth(100);
            GridPane.setFillHeight(shiftRep, true);
            GridPane.setFillWidth(shiftRep, true);
            //css styling
            //todo: different colour for current day
            shiftRep.setStyle("-fx-background-color: skyblue");

            this.add(shiftRep, col, row, 1, length);
        }
    }
}