"use client"; // components/header/settingsModal/SettingsModal.tsx
import React, { useState, useEffect } from "react";
import ReactModal from "react-modal";
import "bootstrap-icons/font/bootstrap-icons.css";
import { RootState } from "../../../redux/store";
import { useSelector } from "react-redux";
import handleClearDatabase from "./handlers/handleClearDatabase";
import handleReboot from "./handlers/handleReboot";
import handleSetDateTime from "./handlers/handleSetDateTime";
import handleSubmit from "./handlers/handleSubmit";
import bcrypt from "bcryptjs";
import CryptoJS from "crypto-js";
import { useAdminAuth } from "./hooks/useAdminAuth";
import { useSystemSettings } from "./hooks/useSystemSettings";
import { generateKeyAndIV, generateToken } from "./utils/cryptoUtils";
import USERS from "./config/users";
import handleAdminLogin from "./handlers/handleAdminLogin";

ReactModal.setAppElement("#__next");

function SettingModal({ showModal, onClose }) {
  const { isAdminLoggedIn, logoutAdmin } = useAdminAuth(showModal);

  const { formValues, setFormValues } = useSystemSettings(showModal);

  const [username, setUsername] = useState("");
  const [password, setPassword] = useState("");
  const [error, setError] = useState("");
  const [showLoginForm, setShowLoginForm] = useState(false);

  const deviceName_Redux = useSelector(
    (state: RootState) => state.systemSettings.deviceName
  );
  const mac1_Redux = useSelector(
    (state: RootState) => state.systemSettings.mac1
  );
  const ip_Redux = useSelector((state: RootState) => state.systemSettings.ip);
  const subnet_Redux = useSelector(
    (state: RootState) => state.systemSettings.subnet
  );
  const gateway_Redux = useSelector(
    (state: RootState) => state.systemSettings.gateway
  );
  const datetime_Redux = useSelector(
    (state: RootState) => state.systemSettings.cplInternalTimestamp
  );
  const ntp1_Redux = useSelector(
    (state: RootState) => state.systemSettings.ntp1
  );
  const ntp2_Redux = useSelector(
    (state: RootState) => state.systemSettings.ntp2
  );
  const ntp3_Redux = useSelector(
    (state: RootState) => state.systemSettings.ntp3
  );
  const ntpTimezone_Redux = useSelector(
    (state: RootState) => state.systemSettings.ntpTimezone
  );
  const active_Redux = useSelector(
    (state: RootState) => state.systemSettings.ntpActive
  );

  const [name, setName] = useState(deviceName_Redux || "");
  const [mac1, setMac1] = useState(mac1_Redux || "");
  const [ip, setIp] = useState(ip_Redux || "");
  const [subnet, setSubnet] = useState(subnet_Redux || "");
  const [gateway, setGateway] = useState(gateway_Redux || "");
  const [systemUhr, setSystemUhr] = useState(datetime_Redux || "");
  const [ntp1, setNtp1] = useState(ntp1_Redux || "");
  const [ntp2, setNtp2] = useState(ntp2_Redux || "");
  const [ntp3, setNtp3] = useState(ntp3_Redux || "");
  const [ntpTimezone, setNtpTimezone] = useState(ntpTimezone_Redux || "");
  const [active, setActive] = useState(active_Redux || "");

  const [originalValues, setOriginalValues] = useState({});
  const currentValues = {
    name,
    ip,
    subnet,
    gateway,
    ntp1,
    ntp2,
    ntp3,
    ntpTimezone,
    active,
  };

  return (
    <ReactModal
      isOpen={showModal}
      onRequestClose={onClose}
      shouldCloseOnOverlayClick={false}
      overlayClassName="fixed inset-0 bg-black bg-opacity-50 z-50 flex items-center justify-center"
      className="w-[90%] max-w-[800px] h-auto max-h-[90vh] lg:max-h-[80vh] overflow-y-auto p-6 lg:p-4 bg-white rounded-lg relative border-none laptop:scale-75"
    >
      <button
        onClick={onClose}
        style={{
          position: "absolute",
          top: "10px",
          right: "10px",
          background: "transparent",
          border: "none",
          cursor: "pointer",
          fontSize: "24px",
        }}
      >
        <i className="bi bi-x-circle-fill"></i>
      </button>

      {/* Hauptinhalt oder Login-Formular */}
      {showLoginForm ? (
        <div className="text-black">
          <h2 className="text-lg font-bold mb-4">Admin Login</h2>
          <form onSubmit={(e) => e.preventDefault()}>
            <div className="mb-4">
              <label className="block text-sm font-medium">Benutzername:</label>
              <input
                type="text"
                className="border border-gray-300 rounded p-2 w-full"
                value={username}
                onChange={(e) => setUsername(e.target.value)}
              />
            </div>
            <div className="mb-4">
              <label className="block text-sm font-medium">Passwort:</label>
              <input
                type="password"
                className="border border-gray-300 rounded p-2 w-full"
                value={password}
                onChange={(e) => setPassword(e.target.value)}
              />
            </div>
            {error && <p className="text-red-500">{error}</p>}
            <button
              onClick={handleAdminLogin}
              className="bg-littwin-blue text-white px-4 py-2 rounded w-full"
            >
              Anmelden
            </button>
          </form>
        </div>
      ) : (
        <div className="text-black">
          <h2 className="text-lg font-bold mb-4">System:</h2>
          <form>
            <div className="mb-4">
              <label className="block text-sm font-medium">Name:</label>
              <input
                type="text"
                className="border border-gray-300 rounded p-2 w-full"
                value={name}
                onChange={(e) => setName(e.target.value)}
              />
            </div>

            <div className="mb-4 grid grid-cols-1 md:grid-cols-2 gap-4">
              <div>
                <label className="block text-sm font-medium">
                  MAC Adresse 1:
                </label>
                <input
                  type="text"
                  className="border border-gray-300 rounded p-2 w-full"
                  value={mac1}
                  disabled
                />
              </div>
              <div>
                <label className="block text-sm font-medium">Systemuhr:</label>
                <input
                  type="text"
                  className="border border-gray-300 rounded p-2 w-full"
                  value={systemUhr}
                  disabled
                />
                <button
                  className="bg-littwin-blue text-white px-4 py-2 rounded mt-2 w-full"
                  onClick={() => {
                    if (
                      window.confirm(
                        "Möchten Sie wirklich die Systemzeit übernehmen?"
                      )
                    ) {
                      handleSetDateTime();
                    }
                  }}
                >
                  Systemzeit übernehmen
                </button>
              </div>
            </div>

            <div className="mb-4 grid grid-cols-1 md:grid-cols-2 gap-4">
              <div>
                <label className="block text-sm font-medium">IP:</label>
                <input
                  type="text"
                  className="border border-gray-300 rounded p-2 w-full"
                  value={ip}
                  onChange={(e) => setIp(e.target.value)}
                />
              </div>
              <div>
                <label className="block text-sm font-medium">Subnet:</label>
                <input
                  type="text"
                  className="border border-gray-300 rounded p-2 w-full"
                  value={subnet}
                  onChange={(e) => setSubnet(e.target.value)}
                />
              </div>
              <div>
                <label className="block text-sm font-medium">Gateway:</label>
                <input
                  type="text"
                  className="border border-gray-300 rounded p-2 w-full"
                  value={gateway}
                  onChange={(e) => setGateway(e.target.value)}
                />
              </div>
            </div>

            {/* SNTP Client */}
            <h3 className="text-sm font-bold mb-2">SNTP Client:</h3>
            <div className="mb-4 grid grid-cols-1 md:grid-cols-2 gap-4">
              <div>
                <label className="block text-sm font-medium">
                  IP NTP Server 1:
                </label>
                <input
                  type="text"
                  className="border border-gray-300 rounded p-2 w-full"
                  value={ntp1}
                  onChange={(e) => setNtp1(e.target.value)}
                />
              </div>
              <div>
                <label className="block text-sm font-medium">
                  IP NTP Server 2:
                </label>
                <input
                  type="text"
                  className="border border-gray-300 rounded p-2 w-full"
                  value={ntp2}
                  onChange={(e) => setNtp2(e.target.value)}
                />
              </div>
              <div>
                <label className="block text-sm font-medium">
                  IP NTP Server 3:
                </label>
                <input
                  type="text"
                  className="border border-gray-300 rounded p-2 w-full"
                  value={ntp3}
                  onChange={(e) => setNtp3(e.target.value)}
                />
              </div>
              <div>
                <label className="block text-sm font-medium">Zeitzone:</label>
                <input
                  type="text"
                  className="border border-gray-300 rounded p-2 w-full"
                  value={ntpTimezone}
                  onChange={(e) => setNtpTimezone(e.target.value)}
                />
              </div>
              <div>
                <label className="block text-sm font-medium">NTP Active:</label>
                <input
                  type="text"
                  className="border border-gray-300 rounded p-2 w-full"
                  value={active}
                  onChange={(e) => setActive(e.target.value)}
                />
              </div>
            </div>

            {/* Buttons: gestapelt auf kleinen Bildschirmen, nebeneinander auf großen */}
            <div className="flex flex-col md:flex-row justify-between mt-4 gap-2">
              <button
                className="bg-littwin-blue text-white px-4 py-2 rounded w-full md:w-auto"
                onClick={handleReboot}
              >
                Neustart CPL
              </button>
              <button
                onClick={() =>
                  isAdminLoggedIn ? handleAdminLogout() : setShowLoginForm(true)
                }
                className="bg-littwin-blue text-white px-4 py-2 rounded w-full md:w-auto"
              >
                {isAdminLoggedIn ? "Admin abmelden" : "Admin anmelden"}
              </button>
              <button
                className="bg-littwin-blue text-white px-4 py-2 rounded w-full md:w-auto"
                onClick={handleClearDatabase}
              >
                Datenbank leeren
              </button>
              <button
                className="bg-littwin-blue text-white px-4 py-2 rounded w-full md:w-auto"
                onClick={() => handleSubmit(originalValues, currentValues)}
              >
                Übernehmen
              </button>
            </div>
          </form>
        </div>
      )}
    </ReactModal>
  );
}

export default SettingModal;
