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;

public class DailyView extends GridPane implements ModelSubscriber{
    Model model;
    iModel iModel;
    ArrayList<Label> times;

    public DailyView() {
        //list of time labels
        times = new ArrayList<Label>();
        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);
            jLabel.setPrefHeight(20);
            //jLabel.setStyle(" -fx-border-color: black");
            Label kLabel = new Label(k);
            kLabel.setPrefHeight(20);
            //kLabel.setStyle(" -fx-border-color: black");
            times.add(jLabel);
            times.add(kLabel);
        }
        // add to gridpane - time axis never changes
        int i = 1;
        for (Label time : times){
            this.add(time, 0, i);
            i++;
        }
    }

    public void setiModel(iModel imodel) {
        this.iModel = imodel;
    }

    public void setModel(Model newModel) {
        this.model = newModel;
        //now can draw for first time
        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++;
        }


        int col = 1;    //start on the second column
        int row;        //depends on start time
        int length;     //depends on end time - start time
        // update employee axis and schedule display
        ArrayList<Shift> schedule = model.getDailySchedule();
        for (Shift shift : schedule){
            Label name = new Label(Integer.toString(shift.getEmployeeID()));
            GridPane.setHalignment(name, HPos.CENTER);
            this.add(name, col, 0);   //todo: display name instead

            //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.setPrefWidth(60);
            GridPane.setFillHeight(shiftRep, true);
            GridPane.setFillWidth(shiftRep, true);
            //css styling
            //todo: different colour for current user
            shiftRep.setStyle("-fx-background-color: skyblue");

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

            col++;

        }

    }

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