import { useMutation } from "@apollo/client/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";
import { useNotification } from "../../contexts/Notifications/notificationContext.jsx";

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 notification = useNotification();

  const handleCancel = async ({ lost_sale_reason }) => {
    logImEXEvent("schedule_cancel_appt");

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

    if (cancelAppt.errors) {
      notification.error({
        title: 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({
          title: t("jobs.errors.updating", {
            message: JSON.stringify(jobUpdate.errors)
          })
        });
        return;
      }
    }
    if (refetch) refetch();
  };

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