import type { PlantSetupProfile, SpaceType } from '../../types/garden';
import { potTypeOptions } from '../../types/appTypes';
import { formatGardenValue } from './coreFormatters';

function positiveFiniteNumber(value: unknown): number | undefined {
  return typeof value === 'number' && Number.isFinite(value) && value > 0 ? value : undefined;
}

export function formatDedicatedArtificialLight(setup?: PlantSetupProfile | null): string {
  if (!setup || setup.usesDedicatedArtificialLight == null) return 'Dedicated plant light not set';
  if (setup.usesDedicatedArtificialLight === false) return 'No dedicated plant light';

  const types = Array.isArray(setup.dedicatedArtificialLightTypes)
    ? setup.dedicatedArtificialLightTypes.filter(Boolean)
    : [];
  const typeText = types.length ? types.map(formatGardenValue).join(', ') : 'Type not set';
  const hours = positiveFiniteNumber(setup.dedicatedArtificialLightHoursPerDay);
  const distance = typeof setup.dedicatedArtificialLightDistance === 'string'
    ? setup.dedicatedArtificialLightDistance.trim()
    : setup.dedicatedArtificialLightDistance;

  return `${typeText}${hours != null ? `, ${hours} hr/day` : ''}${distance ? `, ${distance}` : ''}`;
}

export function getPotTypeOptionsForSpace(spaceType?: SpaceType | null): typeof potTypeOptions {
  // Placement mode (in-ground / raised bed / hydroponic) is owned by the
  // "How is it planted?" gate. Container options remain valid in every space.
  void spaceType;
  return potTypeOptions;
}

export function getEffectivePotTypeForSpace(
  potType: PlantSetupProfile['potType'],
  spaceType?: SpaceType | null,
): PlantSetupProfile['potType'] {
  return getPotTypeOptionsForSpace(spaceType).some(option => option.value === potType) ? potType : 'unsure';
}

export function formatAttentionCount(count: number): string {
  const safeCount = Number.isFinite(count) ? Math.max(0, Math.trunc(count)) : 0;
  return `${safeCount} ${safeCount === 1 ? 'Needs Attention' : 'Need Attention'}`;
}

export function normalizeLightHoursInput(value: string): number | undefined {
  const clean = typeof value === 'string' ? value.trim().replace(',', '.') : '';
  if (!clean) return undefined;

  const numericTokens = clean.match(/[+-]?(?:\d+(?:\.\d*)?|\.\d+)/g);
  if (!numericTokens || numericTokens.length !== 1) return undefined;

  const numericValue = Number(numericTokens[0]);
  if (!Number.isFinite(numericValue) || numericValue <= 0) return undefined;

  const rounded = Math.round(Math.min(24, numericValue) * 10) / 10;
  return rounded > 0 ? rounded : undefined;
}
