import { flatMap } from "lodash";
import { observer } from "mobx-react";
import * as moment from "moment";
import * as React from "react";
import { Button, Table } from "semantic-ui-react";

import { Duration } from "@common/Duration";
import { DateOfYear, Program, Schedule, Section, TimeOfDay, Weekday } from "@common/sprinklers";

function timeToString(time: TimeOfDay) {
    return moment(time).format("LTS");
}

function formatDateOfYear(day: DateOfYear | null, prefix: string) {
    if (day == null) {
        return null;
    }
    return prefix + moment(day).format("l");
}

@observer
export class ScheduleView extends React.Component<{ schedule: Schedule }> {
    render() {
        const { schedule } = this.props;
        const times = schedule.times.map((time, i) => timeToString(time))
            .join(", ");
        const weekdays = schedule.weekdays.map((weekday) =>
            Weekday[weekday]).join(", ");
        const from = formatDateOfYear(schedule.from, "From ");
        const to = formatDateOfYear(schedule.to, "To ");
        return (
            <div>
                At {times} <br />
                On {weekdays} <br />
                {from} <br />
                {to}
            </div>
        );
    }
}

@observer
export default class ProgramTable extends React.Component<{ programs: Program[], sections: Section[] }> {
    render() {
        const programRows = Array.prototype.concat.apply([],
            this.props.programs.map(this.renderRows));

        return (
            <Table celled>
                <Table.Header>
                    <Table.Row>
                        <Table.HeaderCell colSpan="7">Programs</Table.HeaderCell>
                    </Table.Row>
                    <Table.Row>
                        <Table.HeaderCell className="program--number">#</Table.HeaderCell>
                        <Table.HeaderCell className="program--name">Name</Table.HeaderCell>
                        <Table.HeaderCell className="program--running">Running?</Table.HeaderCell>
                        <Table.HeaderCell className="program--enabled">Enabled?</Table.HeaderCell>
                    </Table.Row>
                </Table.Header>
                <Table.Body>
                    {programRows}
                </Table.Body>
            </Table>
        );
    }

    private renderRows = (program: Program, i: number): JSX.Element[] | null => {
        if (!program) {
            return null;
        }
        const { name, running, enabled, schedule, sequence } = program;
        const sequenceItems = flatMap(sequence, (item, index) => {
            const section = this.props.sections[item.section];
            const duration = Duration.fromSeconds(item.duration);
            return [
                <em key={index}>"{section.name}"</em>, ` for ${duration.toString()}, `,
            ];
        });
        const cancelOrRun = () => running ? program.cancel() : program.run();
        return [(
            <Table.Row key={i}>
                <Table.Cell className="program--number">{"" + (i + 1)}</Table.Cell>
                <Table.Cell className="program--name">{name}</Table.Cell>
                <Table.Cell className="program--running">
                    {running ? "Running" : "Not running"}
                    <Button className="program--runningButton" onClick={cancelOrRun}>
                        {running ? "Cancel" : "Run"}
                    </Button>
                </Table.Cell>
                <Table.Cell className="program--enabled">{enabled ? "Enabled" : "Not enabled"}</Table.Cell>
            </Table.Row>
        ), (
            <Table.Row key={i + .5}>
                <Table.Cell className="program--sequence" colSpan="4">
                    <h4>Sequence: </h4> {sequenceItems}
                    <h4>Schedule: </h4> <ScheduleView schedule={schedule} />
                </Table.Cell>
            </Table.Row>
        )];
    }
}