import { Formik, Form, Field } from "formik";
import FormGroup from "../components/FormGroup";
import type { ModemSettingsType } from "../../../types/types";
import { useWifiAndModem } from "../../../hooks/useCameraWifiandModem";
import { useEffect, useState } from "react";
import ModemToggle from "./ModemToggle";
import { faEyeSlash, faEye } from "@fortawesome/free-solid-svg-icons";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { ValidateIPaddress } from "../../../utils/utils";
import { toast, Toaster } from "sonner";

const ModemSettings = () => {
  const [showSettings, setShowSettings] = useState(false);
  const [showPwd, setShowPwd] = useState(false);
  const { modemQuery, modemMutation } = useWifiAndModem();

  const apn = modemQuery?.data?.propAPN?.value;
  const username = modemQuery?.data?.propUsername.value;
  const password = modemQuery?.data?.propPassword?.value;
  const mode = modemQuery?.data?.propMode?.value;
  const serverPrimary = modemQuery?.data?.propNameServerPrimary?.value;
  const serverSecondary = modemQuery?.data?.propNameServerSecondary?.value;

  useEffect(() => {
    setShowSettings(mode === "AUTO");
  }, [mode]);

  const inititalValues = {
    apn: apn ?? "",
    username: username ?? "",
    password: password ?? "",
    authenticationType: "PAP",
    serverPrimary: serverPrimary ?? "",
    serverSecondary: serverSecondary ?? "",
  };

  const handleSubmit = async (values: ModemSettingsType) => {
    const invalidPrimary = ValidateIPaddress(values.serverPrimary);
    const invalidSecondary = ValidateIPaddress(values.serverSecondary);

    if (invalidPrimary || invalidSecondary) {
      toast.error(invalidPrimary || invalidSecondary, {
        id: "invalid-ip",
      });
      return;
    }

    const fields = [
      { property: "propAPN", value: values.apn },
      { property: "propPassword", value: values.password },
      { property: "propUsername", value: values.username },
      { property: "propMode", value: showSettings ? "AUTO" : "MANUAL" },
      { property: "propNameServerPrimary", value: values.serverPrimary },
    ];

    if (values.serverSecondary?.trim()) {
      fields.push({
        property: "propNameServerSecondary",
        value: values.serverSecondary.trim(),
      });
    }

    const modemConfig = {
      id: "ModemAndWifiManager-modem",
      fields,
    };

    const response = await modemMutation.mutateAsync(modemConfig);

    if (!response?.id) {
      toast.success("Modem settings updated successfully", {
        id: "modemSettings",
      });
    }
  };

  return (
    <>
      <ModemToggle showSettings={showSettings} onShowSettings={setShowSettings} />

      <Formik initialValues={inititalValues} onSubmit={handleSubmit} enableReinitialize>
        {({ isSubmitting }) => (
          <Form className="flex flex-col space-y-5 px-2">
            {!showSettings && (
              <>
                <FormGroup>
                  <label htmlFor="apn" className="font-medium whitespace-nowrap md:w-2/3">
                    APN
                  </label>
                  <Field
                    placeholder="Enter APN"
                    name="apn"
                    id="apn"
                    type="text"
                    className="p-1.5 border border-gray-400 rounded-lg"
                  />
                </FormGroup>
                <FormGroup>
                  <label htmlFor="username" className="font-medium whitespace-nowrap md:w-2/3">
                    Username
                  </label>
                  <Field
                    placeholder="Enter Username"
                    name="username"
                    id="username"
                    type="text"
                    className="p-1.5 border border-gray-400 rounded-lg"
                  />
                </FormGroup>
                <FormGroup>
                  <label htmlFor="password" className="font-medium whitespace-nowrap md:w-2/3">
                    Password
                  </label>
                  <div className="flex gap-2 items-center relative mb-4">
                    <Field
                      id="password"
                      name="password"
                      type={showPwd ? "text" : "password"}
                      className="p-2 border border-gray-400 rounded-lg w-full"
                      placeholder="Enter Password"
                    />
                    <FontAwesomeIcon
                      type="button"
                      className="absolute right-5 end-0"
                      onClick={() => setShowPwd((s) => !s)}
                      icon={showPwd ? faEyeSlash : faEye}
                    />
                  </div>
                </FormGroup>
                <FormGroup>
                  <label htmlFor="serverPrimary" className="font-medium whitespace-nowrap md:w-2/3">
                    Name server primary
                  </label>
                  <Field
                    placeholder="Enter Server primary"
                    name="serverPrimary"
                    id="serverPrimary"
                    type="text"
                    className="p-1.5 border border-gray-400 rounded-lg"
                  />
                </FormGroup>
                <FormGroup>
                  <label htmlFor="serverSecondary" className="font-medium whitespace-nowrap md:w-2/3">
                    Name server secondary
                  </label>
                  <Field
                    placeholder="Enter Server secondary"
                    name="serverSecondary"
                    id="serverSecondary"
                    type="text"
                    className="p-1.5 border border-gray-400 rounded-lg"
                  />
                </FormGroup>
                <FormGroup>
                  <label htmlFor="password" className="font-medium whitespace-nowrap md:w-2/3">
                    Authentication Type
                  </label>
                  <Field
                    name="authenticationType"
                    as="select"
                    className="p-2 border border-gray-400 rounded-lg text-white bg-[#253445] flex-1 w-2/3"
                  >
                    <option value="PAP">PAP</option>
                    <option value="CHAP">CHAP</option>
                    <option value="none">None</option>
                  </Field>
                </FormGroup>
              </>
            )}
            <button
              type="submit"
              className="w-full md:w-1/4 text-white bg-green-700 hover:bg-green-800 font-small rounded-lg text-sm px-2 py-2.5"
            >
              {isSubmitting || modemMutation.isPending ? "Saving..." : "Save Modem settings"}
            </button>
          </Form>
        )}
      </Formik>
      <Toaster />
    </>
  );
};

export default ModemSettings;
