/** Настройки боевой сетки на превью сцены (сохраняется в проекте). */

export const SCENE_GRID_TYPES = ['square', 'hex'] as const;

export type SceneGridType = (typeof SCENE_GRID_TYPES)[number];

export type SceneGrid = {
  /** Наложить сетку на изображение сцены. */
  enabled: boolean;
  type: SceneGridType;
  /** Размер ячейки относительно min(w, h) картинки. */
  sizeN: number;
  /** Hex `#rrggbb`. */
  color: string;
};

export const DEFAULT_SCENE_GRID_SIZE_N = 0.06;
export const SCENE_GRID_SIZE_MIN = 0.02;
export const SCENE_GRID_SIZE_MAX = 0.25;
export const DEFAULT_SCENE_GRID_COLOR = '#ffffff';

export const DEFAULT_SCENE_GRID: SceneGrid = {
  enabled: false,
  type: 'square',
  sizeN: DEFAULT_SCENE_GRID_SIZE_N,
  color: DEFAULT_SCENE_GRID_COLOR,
};

export function clampSceneGridSizeN(sizeN: number): number {
  if (!Number.isFinite(sizeN)) return DEFAULT_SCENE_GRID_SIZE_N;
  return Math.max(SCENE_GRID_SIZE_MIN, Math.min(SCENE_GRID_SIZE_MAX, sizeN));
}

export function normalizeSceneGridColor(raw: unknown): string {
  if (typeof raw !== 'string') return DEFAULT_SCENE_GRID_COLOR;
  const s = raw.trim();
  if (/^#[0-9a-fA-F]{6}$/u.test(s)) return s.toLowerCase();
  if (/^#[0-9a-fA-F]{3}$/u.test(s)) {
    const r = s[1]!;
    const g = s[2]!;
    const b = s[3]!;
    return `#${r}${r}${g}${g}${b}${b}`.toLowerCase();
  }
  return DEFAULT_SCENE_GRID_COLOR;
}

export function normalizeSceneGrid(raw: unknown): SceneGrid {
  if (!raw || typeof raw !== 'object') return { ...DEFAULT_SCENE_GRID };
  const obj = raw as Partial<SceneGrid>;
  const type: SceneGridType = obj.type === 'hex' ? 'hex' : 'square';
  return {
    enabled: Boolean(obj.enabled),
    type,
    sizeN: clampSceneGridSizeN(typeof obj.sizeN === 'number' ? obj.sizeN : DEFAULT_SCENE_GRID_SIZE_N),
    color: normalizeSceneGridColor(obj.color),
  };
}

export function sceneGridTypeLabelRu(type: SceneGridType): string {
  return type === 'hex' ? 'Гексогональная' : 'Квадратная';
}

/**
 * Множитель диаметра токена «в одну ячейку» относительно `grid.sizeN`.
 * Square: сторона клетки = sizeN.
 * Flat-top hex: sizeN — ширина (vertex-to-vertex, описанная окружность);
 * вписанная окружность = flat-to-flat = sizeN · √3/2.
 */
export function sceneGridTokenFitFactor(grid: Pick<SceneGrid, 'enabled' | 'type'> | null | undefined): number {
  if (!grid?.enabled || grid.type !== 'hex') return 1;
  return Math.sqrt(3) / 2;
}
