import { ProgramDataProps } from '@/pages/dashboard/create-program';
import { difficultyRating } from '@/utils/data/exercise-categories';
import { Checkbox, FormControlLabel } from '@mui/material';
import { useState } from 'react';

type DifficultyCheckboxProps = {
  setProgramData: React.Dispatch<React.SetStateAction<ProgramDataProps>>;
  selectedLevels: ProgramDataProps["difficulty"];
}

const DifficultyCheckbox = ({ setProgramData, selectedLevels }: DifficultyCheckboxProps) => {

  const handleLevelChange = (event: React.ChangeEvent<HTMLInputElement>) => {
    const level = parseInt(event.target.value)

    if (level === 0) {
      if (selectedLevels.includes(0)) {
        setProgramData(prevState => ({ ...prevState, difficulty: [] }));
      } else {
        setProgramData(prevState => ({ ...prevState, difficulty: [1, 2, 3, 4, 0] }));
      }
    } else if (selectedLevels.length === 0) {
      setProgramData(prevState => ({ ...prevState, difficulty: [level] }));
    } else if (selectedLevels.length === 1) {
      const currentLevel = selectedLevels[0]

      if (Math.abs(currentLevel - level) === 1) {
        setProgramData(prevState => ({ ...prevState, difficulty: [...prevState.difficulty, level] }));
      } else {
        setProgramData(prevState => ({ ...prevState, difficulty: [level] }));
      }
    } else if (selectedLevels.length === 2) {
      const currentLevel1 = selectedLevels[0]
      const currentLevel2 = selectedLevels[1]

      if (Math.abs(currentLevel1 - level) === 1 && Math.abs(currentLevel2 - level) === 1) {
        setProgramData(prevState => ({ ...prevState, difficulty: [...prevState.difficulty, level] }));
      } else {
        const adjacentLevel = Math.abs(currentLevel1 - level) === 1 ? currentLevel1 : currentLevel2
        setProgramData(prevState => ({ ...prevState, difficulty: [adjacentLevel, level] }));
      }
    } else {
      setProgramData(prevState => ({ ...prevState, difficulty: [level] }));
    }
  }

  return (
    <>
      {difficultyRating.map((level, index) => (
        <FormControlLabel
          key={index}
          value={level}
          control={
            <Checkbox
              checked={selectedLevels.includes(level)}
              onChange={handleLevelChange}
            />
          }
          label={level}
        />
      ))}
    </>
  )
}

export default DifficultyCheckbox