import type { AppState, StateRepository } from '@domain/ports/StateRepository';
import { GAUGE_DEFS, STAT_DEFS } from '@domain/value-objects/GaugeType';
import { xpForLevel } from '@domain/value-objects/XpTable';

export interface StartTimerCommand { type: 'start-timer'; enclosId: number; }

export function createStartTimerHandler(state: AppState, repo: StateRepository) {
  return (cmd: StartTimerCommand): void => {
    const enc = state.enclos.find(e => e.id === cmd.enclosId);
    if (!enc || enc.timer.running) return;
    if (!enc.activeGauges.length || !enc.dragodindes.length) return;

    // Ne pas démarrer si toutes les jauges actives sont à 0 (aucun point ne sera gagné)
    const allGaugesEmpty = enc.activeGauges.every(gid => (enc.gaugeLevels[gid] ?? 0) <= 0);
    if (allGaugesEmpty) return;

    const now = Date.now();

    if (enc.timer.startTime !== null && enc.timer.pausedAt !== null && !enc.alerted['__done__']) {
      // Reprise depuis une pause manuelle : accumuler le temps pausé
      enc.timer.pausedMs += now - enc.timer.pausedAt;
      enc.timer.pausedAt = null;
      enc.timer.running = true;
    } else {
      // Démarrage initial — vérifier qu'au moins une cible n'est pas déjà atteinte
      const allTargetsAlreadyMet = enc.dragodindes.every(dd => {
        return enc.activeGauges.every(gid => {
          const def = GAUGE_DEFS[gid];
          const stat = (dd.stats as Record<string, number>)[def.stat] as number;
          if (def.isXp) {
            const target = dd.levelTarget ?? 200;
            return stat >= target;
          }
          const sd = STAT_DEFS[def.stat];
          if (def.stat === 'serenite' && dd.sereniteTarget !== null && dd.sereniteTarget !== undefined) {
            return def.dir > 0 ? stat >= dd.sereniteTarget : stat <= dd.sereniteTarget;
          }
          return def.dir > 0 ? stat >= sd.max : stat <= sd.min;
        });
      });
      if (allTargetsAlreadyMet) return; // Ne pas démarrer si tout est déjà atteint

      enc.timer.running = true;
      enc.timer.startTime = now;
      enc.timer.pausedAt = null;
      enc.timer.pausedMs = 0;
      enc.timer.snapGauges = { ...enc.gaugeLevels };
      enc.timer.gaugeRecharges = {};
      const snapStats: Record<string, Record<string, number>> = {};
      for (const dd of enc.dragodindes) {
        snapStats[dd.id] = { ...dd.stats };
      }
      enc.timer.snapStats = snapStats;
      enc.alerted = {};
    }

    repo.save(state);
  };
}
