import { useState, useEffect } from "react";
import { IonToggle, IonItem, IonLabel, IonIcon, IonButton } from "@ionic/react";
import { moon, sunny } from "ionicons/icons";

import { Storage } from "@ionic/storage";

interface ThemeToggleProps {
  iconOnly?: boolean;
}

const storage = new Storage();

const ThemeToggle: React.FC<ThemeToggleProps> = ({ iconOnly = false }) => {
  const [paletteToggle, setPaletteToggle] = useState(false);

  // Toggle class on <html>
  const toggleDarkPalette = async (shouldAdd: boolean) => {
    document.documentElement.classList.toggle("ion-palette-dark", shouldAdd);
    setPaletteToggle(shouldAdd);
    await storage.set("darkMode", shouldAdd);
  };

  // Normal Toggle Change
  const toggleChange = (event: CustomEvent) => {
    toggleDarkPalette((event.target as HTMLIonToggleElement).checked);
  };

  // Load saved preference
  useEffect(() => {
    const init = async () => {
      await storage.create();
      const saved = await storage.get("darkMode");

      if (saved !== null) {
        toggleDarkPalette(saved);
      } else {
        const prefersDark = window.matchMedia("(prefers-color-scheme: dark)");
        toggleDarkPalette(prefersDark.matches);
      }
    };
    init();
  }, []);

  // -------------------------------------------------------------------
  // ICON ONLY MODE
  // -------------------------------------------------------------------
  if (iconOnly) {
    return (
      <IonButton
        onClick={() => toggleDarkPalette(!paletteToggle)}
        className="theme-icon-btn"
        slot="end"
      >
        <IonIcon
          icon={paletteToggle ? sunny : moon}
          slot="icon-only"
        />
      </IonButton>
    );
  }

  // -------------------------------------------------------------------
  // NORMAL MODE (label + switch)
  // -------------------------------------------------------------------
  return (
    <>
      <IonLabel>Dark Mode</IonLabel>
      <IonToggle checked={paletteToggle} onIonChange={toggleChange} />
    </>
  );
};

export default ThemeToggle;
