import { observer } from "mobx-react";
import * as React from "react";
import { Form } from "semantic-ui-react";

import { DateOfYear, Schedule, TimeOfDay, Weekday } from "@common/sprinklersRpc";
import ScheduleDate from "./ScheduleDate";
import ScheduleTimes from "./ScheduleTimes";
import WeekdaysView from "./WeekdaysView";

import "@client/styles/ScheduleView";
import { action } from "mobx";

export interface ScheduleViewProps {
    label?: string | React.ReactNode | undefined;
    schedule: Schedule;
    editing?: boolean;
}

@observer
export default class ScheduleView extends React.Component<ScheduleViewProps> {
    render() {
        const { schedule, label } = this.props;
        const editing = this.props.editing || false;

        let labelNode: React.ReactNode;
        if (typeof label === "string") {
            labelNode = <label>{label}</label>;
        } else if (label != null) {
            labelNode = label;
        }

        return (
            <Form.Field className="scheduleView">
                {labelNode}
                <ScheduleTimes times={schedule.times} editing={editing} onChange={this.updateTimes} />
                <WeekdaysView weekdays={schedule.weekdays} editing={editing} onChange={this.updateWeekdays} />
                <ScheduleDate label="From" date={schedule.from} editing={editing} onChange={this.updateFromDate} />
                <ScheduleDate label="To" date={schedule.to} editing={editing} onChange={this.updateToDate} />
            </Form.Field>
        );
    }

    @action.bound
    private updateTimes(newTimes: TimeOfDay[]) {
        this.props.schedule.times = newTimes;
    }

    @action.bound
    private updateWeekdays(newWeekdays: Weekday[]) {
        this.props.schedule.weekdays = newWeekdays;
    }

    @action.bound
    private updateFromDate(newFromDate: DateOfYear | null) {
        this.props.schedule.from = newFromDate;
    }

    @action.bound
    private updateToDate(newToDate: DateOfYear | null) {
        this.props.schedule.to = newToDate;
    }
}