import {useMutation} from "@apollo/client";
import {notification} from "antd";
import React from "react";
import {useTranslation} from "react-i18next";
import {useDispatch} from "react-redux";
import {logImEXEvent} from "../../firebase/firebase.utils";
import {CANCEL_APPOINTMENT_BY_ID} from "../../graphql/appointments.queries";
import {UPDATE_JOB} from "../../graphql/jobs.queries";
import {insertAuditTrail} from "../../redux/application/application.actions";
import AuditTrailMapping from "../../utils/AuditTrailMappings";
import ScheduleEventComponent from "./schedule-event.component";

export default function ScheduleEventContainer({bodyshop, event, refetch}) {
    const dispatch = useDispatch();
    const {t} = useTranslation();
    const [cancelAppointment] = useMutation(CANCEL_APPOINTMENT_BY_ID);
    const [updateJob] = useMutation(UPDATE_JOB);
    const handleCancel = async ({id, lost_sale_reason}) => {
        logImEXEvent("schedule_cancel_appt");

        const cancelAppt = await cancelAppointment({
            variables: {appid: event.id},
        });
        notification["success"]({
            message: t("appointments.successes.canceled"),
        });

        if (!!cancelAppt.errors) {
            notification["error"]({
                message: t("appointments.errors.canceling", {
                    message: JSON.stringify(cancelAppt.errors),
                }),
            });
            return;
        }

        if (event.job) {
            const jobUpdate = await updateJob({
                variables: {
                    jobId: event.job.id,
                    job: {
                        date_scheduled: null,
                        scheduled_in: null,
                        scheduled_completion: null,
                        lost_sale_reason,
                        date_lost_sale: new Date(),
                        status: bodyshop.md_ro_statuses.default_imported,
                    },
                },
            });
            if (!jobUpdate.errors) {
                dispatch(
                    insertAuditTrail({
                        jobid: event.job.id,
                        operation: AuditTrailMapping.appointmentcancel(lost_sale_reason),
                    type: "appointmentcancel",})
                );
            }
            if (!!jobUpdate.errors) {
                notification["error"]({
                    message: t("jobs.errors.updating", {
                        message: JSON.stringify(jobUpdate.errors),
                    }),
                });
                return;
            }
        }
        if (refetch) refetch();
    };

    return (
        <ScheduleEventComponent
            event={event}
            refetch={refetch}
            handleCancel={handleCancel}
        />
    );
}
