import { CSSProperties, FC, useState } from 'react';

import { ConfirmModal, SliderField } from '../components';
import { gamepadSliderClasses } from '../utils/static-classes';

interface ColorPickerModalProps {
  closeModal: () => void;
  onConfirm?(HSLString: string): any;
  title?: string;
  defaultH?: number;
  defaultS?: number;
  defaultL?: number;
  defaultA?: number;
}

export const ColorPickerModal: FC<ColorPickerModalProps> = ({
  closeModal,
  onConfirm = () => {},
  title = 'Color Picker',
  defaultH = 0,
  defaultS = 100,
  defaultL = 50,
  defaultA = 1,
}) => {
  const [H, setH] = useState<number>(defaultH);
  const [S, setS] = useState<number>(defaultS);
  const [L, setL] = useState<number>(defaultL);
  const [A, setA] = useState<number>(defaultA);

  const colorPickerCSSVars = {
    '--decky-color-picker-hvalue': `${H}`,
    '--decky-color-picker-svalue': `${S}%`,
    '--decky-color-picker-lvalue': `${L}%`,
    '--decky-color-picker-avalue': `${A}`,
  } as CSSProperties;

  return (
    <ConfirmModal
      bAllowFullSize
      onCancel={closeModal}
      onOK={() => {
        onConfirm(`hsla(${H}, ${S}%, ${L}%, ${A})`);
        closeModal();
      }}
    >
      <style>
        {`
        /* This removes the cyan track color that is behind the slider head */
        .ColorPicker_Container .${gamepadSliderClasses.SliderTrack} {
          --left-track-color: #0000;
          /* This is for compatibility with the "Colored Toggles" CSSLoader Theme*/
          --colored-toggles-main-color: #0000;
        }

        .ColorPicker_HSlider .${gamepadSliderClasses.SliderTrack} {
          background: linear-gradient(
            270deg,
            hsla(360, var(--decky-color-picker-svalue), var(--decky-color-picker-lvalue), var(--decky-color-picker-avalue)),
            hsla(270, var(--decky-color-picker-svalue), var(--decky-color-picker-lvalue), var(--decky-color-picker-avalue)),
            hsla(180, var(--decky-color-picker-svalue), var(--decky-color-picker-lvalue), var(--decky-color-picker-avalue)),
            hsla(90, var(--decky-color-picker-svalue), var(--decky-color-picker-lvalue), var(--decky-color-picker-avalue)),
            hsla(0, var(--decky-color-picker-svalue), var(--decky-color-picker-lvalue), var(--decky-color-picker-avalue))
          );
        }

        .ColorPicker_SSlider .${gamepadSliderClasses.SliderTrack} {
          background: linear-gradient(
            90deg,
            hsla(var(--decky-color-picker-hvalue), 0%, var(--decky-color-picker-lvalue), var(--decky-color-picker-avalue)),
            hsla(var(--decky-color-picker-hvalue), 100%, var(--decky-color-picker-lvalue), var(--decky-color-picker-avalue))
          );
        }

        .ColorPicker_LSlider .${gamepadSliderClasses.SliderTrack} {
          background: linear-gradient(
            90deg,
            hsla(var(--decky-color-picker-hvalue), var(--decky-color-picker-svalue), 0%, var(--decky-color-picker-avalue)),
            hsla(var(--decky-color-picker-hvalue), var(--decky-color-picker-svalue), 50%, var(--decky-color-picker-avalue)),
            hsla(var(--decky-color-picker-hvalue), var(--decky-color-picker-svalue), 100%, var(--decky-color-picker-avalue))
          );
        }

        .ColorPicker_ASlider .${gamepadSliderClasses.SliderTrack} {
          background: linear-gradient(
            90deg,
            hsla(var(--decky-color-picker-hvalue), var(--decky-color-picker-svalue), var(--decky-color-picker-lvalue), 0),
            hsla(var(--decky-color-picker-hvalue), var(--decky-color-picker-svalue), var(--decky-color-picker-lvalue), 1)
          );
        }
        `}
      </style>
      <div
        className="ColorPicker_ColorDisplayContainer"
        style={{
          display: 'flex',
          justifyContent: 'space-between',
          alignItems: 'center',
          marginBottom: '1em',
          // theres a large header by default on the modal, so this just pushes it up into that unused space
          marginTop: '-2.5em',
        }}
      >
        <div>
          <span style={{ fontSize: '1.5em' }}>
            <b>{title}</b>
          </span>
        </div>
        <div
          style={{
            backgroundColor: `hsla(${H}, ${S}%, ${L}%, ${A})`,
            width: '40px',
            height: '40px',
          }}
        ></div>
      </div>
      <div className="ColorPicker_Container" style={colorPickerCSSVars}>
        <div className="ColorPicker_HSlider">
          <SliderField showValue editableValue label="Hue" value={H} min={0} max={360} onChange={setH} />
        </div>
        <div className="ColorPicker_SSlider">
          <SliderField showValue editableValue label="Saturation" value={S} min={0} max={100} onChange={setS} />
        </div>
        <div className="ColorPicker_LSlider">
          <SliderField showValue editableValue label="Lightness" value={L} min={0} max={100} onChange={setL} />
        </div>
        <div className="ColorPicker_ASlider">
          <SliderField showValue editableValue label="Alpha" value={A} step={0.1} min={0} max={1} onChange={setA} />
        </div>
      </div>
    </ConfirmModal>
  );
};
