/**
 * Meşguliyet senaryoları modülü
 * Gerçekçi gecikme ve meşguliyet senaryoları üretir.
 * @module timer-system/busy-scenarios
 * Gereksinimler: 5.2, 5.4
 */

export interface BusyScenario {
  id: string;
  name: string;
  message: string;
  delayMinutes: { min: number; max: number };
  timeRestriction?: { start: number; end: number };
}

export const BUSY_SCENARIOS: BusyScenario[] = [
  {
    id: 'sport',
    name: 'Spor',
    message: 'spordayım, birazdan yazarım 💪',
    delayMinutes: { min: 25, max: 45 },
  },
  {
    id: 'shower',
    name: 'Duş',
    message: 'duştayım, çıkınca yazarım 🚿',
    delayMinutes: { min: 15, max: 30 },
  },
  {
    id: 'social',
    name: 'Sosyal',
    message: 'arkadaşlarla dışarıdayım, sonra yazarım 🥂',
    delayMinutes: { min: 30, max: 60 },
  },
  {
    id: 'sleep',
    name: 'Uyku',
    message: 'uyuyakalmışım 😴',
    delayMinutes: { min: 60, max: 180 },
    timeRestriction: { start: 23, end: 7 },
  },
  {
    id: 'cooking',
    name: 'Yemek',
    message: 'yemek yapıyorum, birazdan bakarım 🍳',
    delayMinutes: { min: 20, max: 40 },
  },
  {
    id: 'shopping',
    name: 'Alışveriş',
    message: 'alışverişteyim, dönerken yazarım 🛍️',
    delayMinutes: { min: 30, max: 60 },
  },
];

/**
 * Verilen saate uygun rastgele bir meşguliyet senaryosu seçer.
 * Gece saatlerinde (23-07) uyku senaryosu ağırlıklı seçilir.
 */
export function selectRandomScenario(hour: number): BusyScenario {
  const eligible = BUSY_SCENARIOS.filter((s) => {
    if (!s.timeRestriction) return true;
    const { start, end } = s.timeRestriction;
    // Gece aralığı: start > end (ör: 23-07)
    if (start > end) {
      return hour >= start || hour < end;
    }
    return hour >= start && hour < end;
  });

  // Gece saatlerinde uyku senaryosuna ağırlık ver
  const isNight = hour >= 23 || hour < 7;
  if (isNight) {
    const sleepScenario = eligible.find((s) => s.id === 'sleep');
    if (sleepScenario && Math.random() < 0.6) {
      return sleepScenario;
    }
  }

  return eligible[Math.floor(Math.random() * eligible.length)];
}

/**
 * Senaryo için doğal sapmalı gecikme süresi hesaplar (saniye cinsinden).
 * Tam min/max değerleri yerine ±%15 doğal sapma ekler.
 */
export function calculateBusyDelay(scenario: BusyScenario): number {
  const { min, max } = scenario.delayMinutes;
  const baseMinutes = min + Math.random() * (max - min);

  // ±%15 doğal sapma ekle
  const deviation = baseMinutes * 0.15;
  const finalMinutes = baseMinutes + (Math.random() * 2 - 1) * deviation;

  // min * 0.85 ile max * 1.15 arasında sınırla
  const clamped = Math.max(min * 0.85, Math.min(max * 1.15, finalMinutes));

  return Math.round(clamped * 60);
}
