import Card from "react-bootstrap/Card";
import Button from "react-bootstrap/Button";
import DashboardCard from "./DashboardCard";
import {useContext, useMemo, useState} from "react";
import {Teacher, Term} from "../../interfaces";
import Form from "react-bootstrap/Form";
import {isHiddenTeacher, sectionsTaughtThisTerm} from "../../lib/teachers";
import {globalContext} from "../../contexts";
import {getTeachersForDay} from "../../lib/teachers";

type QuickEmailButtonProps = { title: string, teachers: Teacher[], body: string }

const QuickEmailButton = ({title, teachers, body}: QuickEmailButtonProps) =>
    <Button disabled={teachers.length === 0}
            onClick={() => openEmailTemplate(teachers.map(t => t.email), body)}>{title}</Button>;

const openEmailTemplate = (to: string[], body: string) => {
    const deduplicatedEmails = Array.from(new Set(to));

    // Open the mailto URL and focus the window
    const win = window.open(`mailto:${deduplicatedEmails.join(",")}?body=${encodeURI(body)}`, "_blank");
    if (win !== null) {
        win.focus();
    }
};

type TeacherObject = { semester: Teacher[], today: Teacher[], tomorrow: Teacher[] }

export default function QuickEmailCard({currentTerm}: { currentTerm: Term | null }) {
    const {psData} = useContext(globalContext);

    const [hideTeachers, setHideTeachers] = useState(true);

    const teachers = useMemo(() => {
        const teachers: TeacherObject = {
            semester: [],
            today: [],
            tomorrow: []
        };

        const currentDate = new Date();

        if (currentTerm !== null) {
            teachers.semester = psData.teachers.filter(t => sectionsTaughtThisTerm(t, currentTerm));
            teachers.today = getTeachersForDay(currentDate, psData.schedule);
            teachers.tomorrow = getTeachersForDay(new Date(new Date().setDate(currentDate.getDate() + 1)), psData.schedule);
        }

        return teachers;
    }, [psData.teachers, currentTerm, psData.schedule]);

    const displayTeachers: TeacherObject = useMemo(() =>
            (!hideTeachers || currentTerm === null)
                ? teachers
                : {
                    semester: teachers.semester.filter(t => !isHiddenTeacher(t, currentTerm)),
                    today: teachers.today.filter(t => !isHiddenTeacher(t, currentTerm)),
                    tomorrow: teachers.tomorrow.filter(t => !isHiddenTeacher(t, currentTerm))
                }
        , [teachers, hideTeachers, currentTerm]);

    const emailBodyTemplate = `Dear teachers,\n\n\n\nThanks,\n${psData.student.firstName}`;

    return (
        <DashboardCard>
            <Card.Title>Quick Email Compose to:</Card.Title>
            <Form.Check type="checkbox" label="Hide teachers without graded classes" checked={hideTeachers}
                        onChange={e => setHideTeachers(e.currentTarget.checked)}/>
            <div className="d-grid gap-2">
                <QuickEmailButton title="All current teachers" teachers={displayTeachers.semester}
                                  body={emailBodyTemplate}/>
                <QuickEmailButton title="All teachers with classes today" teachers={displayTeachers.today}
                                  body={emailBodyTemplate}/>
                <QuickEmailButton title="All teachers with classes tomorrow" teachers={displayTeachers.tomorrow}
                                  body={emailBodyTemplate}/>
            </div>
        </DashboardCard>
    )
};