import React, { useState, useEffect } from "react";
import { useDepartments } from "../useDepartments";
import {
  C,
  Cardiology,
  Cpr,
  FourByFour,
} from "healthicons-react-native/dist/outline";
import { useWebSocketContext } from "@/hooks";

const callIconMap = {
  "CHEST PAIN|HEART PROBLEMS": Cardiology,
  "CARDIAC ARREST|DEATH": Cpr,
  "MOTOR VEHICLE COLLISION (MVC)": FourByFour,
};

// Squares

// Cariology - Heart
// BurnUnit - Fire
// AccidentAndEmergency - Misc.
// Rheumatology - Bone/Crash
// Sonography - Baby
// PainManagement - CPR/Cardiac Arrest
// Respiratory - Diff Breathing

// Others

// HeartOrgan - Heart
// Burn - Burns
// FHIR - Structure Fire
// Sonogram - Baby
// SUV - Crash
// Joints - Bone
// Pain - CPR/Cardiac Arrest
// Skull - CPR/Cardiac Arrest
// CPR - CPR/Cardiac Arrest
// Pneumonia - Diff Breathing
// CoughingAlt - Diff Breathing
// Diabetes - Diabetic Emergency
// BloodDrop - Bleeding Emergencies
// Bacteria - Sick
// RuralClinic - Medical Facility Response

const formatCallTimePast = (callValue) => {
  const initDate = new Date(callValue);
  const currentTime = new Date();

  const timeDifference = currentTime - initDate;

  const days = Math.floor(timeDifference / (1000 * 60 * 60 * 24));
  const hours = Math.floor(
    (timeDifference % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60)
  );
  const minutes = Math.floor((timeDifference % (1000 * 60 * 60)) / (1000 * 60));
  const seconds = Math.floor((timeDifference % (1000 * 60)) / 1000);
  if (days && days !== 0) {
    return `${days} day${days === 1 ? "" : "s"} ago`;
  } else if (hours && hours !== 0) {
    return `${hours} hour${hours === 1 ? "" : "s"} ago`;
  } else if (minutes && minutes !== 0) {
    return `${minutes} minute${minutes === 1 ? "" : "s"} ago`;
  } else if (seconds && seconds !== 0) {
    return `${seconds} second${seconds === 1 ? "" : "s"} ago`;
  }
  return `Unknown Time Past`;
};

const formatCallDateTime = (callValue) => {
  const initDate = new Date(callValue);
  if (initDate) {
    const formattedDate = `${initDate.toLocaleDateString("en-US", {
      month: "short",
      day: "numeric",
      year: "numeric",
    })}`;
    const hours = initDate.getHours().toString().padStart(2, "0");
    const minutes = initDate.getMinutes().toString().padStart(2, "0");
    const formattedTime = `${hours}:${minutes}`;

    return `${formattedDate} - ${formattedTime}`;
  }
  return "Date Unavailable";
};

const getIncidents = async (departments, incidentStatus) => {
  let response;
  try {
    response = await fetch(`${process.env.EXPO_PUBLIC_DATABASE_URL}/api/getRecentCalls`, {
      method: "GET",
      headers: {
        "Content-Type": "application/json",
        apiKey: process.env.EXPO_PUBLIC_DATABASE_API_KEY
      },
      body: JSON.stringify({
        departments,
        status: incidentStatus,
      }),
    });
  } catch (e) {
    console.error("Failed to fetch initial calls:", e);
  }
  return response?.json() || [];
};

export const useCallFeed = () => {
  const departments = useDepartments();
  const { lastMessage } = useWebSocketContext();
  const [allCalls, setAllCalls] = useState([]);
  const [init, setInit] = useState(true);
  const { CallThemes, InitList } = departments?.accountDetails;
  const { CriticalCallList, HighCallList, MediumCallList, LowCallList } =
    CallThemes;
  const [selectedStatus, setSelectedStatus] = useState({id: 'all', value: 'All Incidents'});

  useEffect(() => {
    const incidents = getIncidents(InitList?.map((dept) => { return dept?.id }), selectedStatus?.id);
    setAllCalls(incidents);
    setInit(false);
  }, []);

  useEffect(() => {
    if (lastMessage && !init) {
      const parsedMessage = JSON?.parse(lastMessage);
      if (parsedMessage?.data) {
        setAllCalls([...allCalls, parsedMessage]);
      }
    }
  }, [lastMessage]);

  useEffect(() => {
    if (!init) {
      const incidents = getIncidents(InitList?.map((dept) => { return dept?.id }), selectedStatus?.id);
      setAllCalls(incidents);
    }
  }, [selectedStatus]);

  const callColorSelector = (callAcuity, cardiacArrestCall, status) => {
    if (status === "CLOSED") {
      return "#0000CD";
    } else if (CriticalCallList.includes(cardiacArrestCall)) {
      return "#8B0000";
    } else if (HighCallList.includes(callAcuity)) {
      return "#FF0000";
    } else if (MediumCallList.includes(callAcuity)) {
      return "#FF8C00";
    } else if (LowCallList.includes(callAcuity)) {
      return "#228B22";
    }
    return "grey";
  };

  return {
    departments,
    callIconMap,
    callDetails: allCalls,
    callColorSelector,
    formatCallTimePast,
    formatCallDateTime,
    selectedStatus,
    setSelectedStatus
  };
};
