import { CommandSetConfig } from '../commandTypes'
import {
  BaseUnit,
  Toggle,
  UnitSystem,
  baseUnitsUnion,
  settingsMachine,
} from 'machines/settingsMachine'
import { CameraSystem, cameraSystems } from '../cameraControls'
import { Themes } from '../theme'

// SETTINGS MACHINE
export type SettingsCommandSchema = {
  'Set Base Unit': {
    baseUnit: BaseUnit
  }
  'Set Camera Controls': {
    cameraControls: CameraSystem
  }
  'Set Default Project Name': {
    defaultProjectName: string
  }
  'Set Text Wrapping': {
    textWrapping: Toggle
  }
  'Set Theme': {
    theme: Themes
  }
  'Set Unit System': {
    unitSystem: UnitSystem
  }
}

export const settingsCommandBarConfig: CommandSetConfig<
  typeof settingsMachine,
  SettingsCommandSchema
> = {
  'Set Base Unit': {
    icon: 'gear',
    args: {
      baseUnit: {
        inputType: 'options',
        required: true,
        defaultValue: (context) => context.baseUnit,
        options: (context) =>
          Object.values(baseUnitsUnion).map((v) => ({
            name: v,
            value: v,
            isCurrent: v === context.baseUnit,
          })),
      },
    },
  },
  'Set Camera Controls': {
    icon: 'gear',
    args: {
      cameraControls: {
        inputType: 'options',
        required: true,
        defaultValue: (context) => context.cameraControls,
        options: (context) =>
          Object.values(cameraSystems).map((v) => ({
            name: v,
            value: v,
            isCurrent: v === context.cameraControls,
          })),
      },
    },
  },
  'Set Default Project Name': {
    icon: 'gear',
    hide: 'web',
    args: {
      defaultProjectName: {
        inputType: 'string',
        required: true,
        defaultValue: (context) => context.defaultProjectName,
      },
    },
  },
  'Set Text Wrapping': {
    icon: 'gear',
    args: {
      textWrapping: {
        inputType: 'options',
        required: true,
        defaultValue: (context) => context.textWrapping,
        options: (context) => [
          {
            name: 'On',
            value: 'On' as Toggle,
            isCurrent: context.textWrapping === 'On',
          },
          {
            name: 'Off',
            value: 'Off' as Toggle,
            isCurrent: context.textWrapping === 'Off',
          },
        ],
      },
    },
  },
  'Set Theme': {
    icon: 'gear',
    args: {
      theme: {
        inputType: 'options',
        required: true,
        defaultValue: (context) => context.theme,
        options: (context) =>
          Object.values(Themes).map((v) => ({
            name: v,
            value: v,
            isCurrent: v === context.theme,
          })),
      },
    },
  },
  'Set Unit System': {
    icon: 'gear',
    args: {
      unitSystem: {
        inputType: 'options',
        required: true,
        defaultValue: (context) => context.unitSystem,
        options: (context) => [
          {
            name: 'Imperial',
            value: 'imperial' as UnitSystem,
            isCurrent: context.unitSystem === 'imperial',
          },
          {
            name: 'Metric',
            value: 'metric' as UnitSystem,
            isCurrent: context.unitSystem === 'metric',
          },
        ],
      },
    },
  },
}
