// Pure OEE interpretation engine — no React, no Supabase

export interface OeeSnapshot {
  oee: number
  availability: number
  performance: number
  quality: number
  unplannedLossMin?: number
  speedLossMin?: number
  qualityLossMin?: number
}

export interface OeeTargets {
  targetOee: number
  targetAvailability: number
  targetPerformance: number
  targetQuality: number
}

const DEFAULT_TARGETS: OeeTargets = {
  targetOee:          0.85,
  targetAvailability: 0.90,
  targetPerformance:  0.95,
  targetQuality:      0.995,
}

export function generateInterpretation(
  current: OeeSnapshot,
  previous?: OeeSnapshot,
  targets: OeeTargets = DEFAULT_TARGETS,
  trendHistory?: OeeSnapshot[],
): string[] {
  const lines: string[] = []

  // 1 — OEE vs target
  const oeePP = (current.oee - targets.targetOee) * 100
  if (oeePP >= 0) {
    lines.push(
      `OEE liegt ${oeePP.toFixed(1)} PP über dem Zielwert von ${(targets.targetOee * 100).toFixed(0)} %.`
    )
  } else {
    lines.push(
      `OEE liegt ${Math.abs(oeePP).toFixed(1)} PP unter dem Zielwert von ${(targets.targetOee * 100).toFixed(0)} %.`
    )
  }

  // 2 — Main loss driver (largest gap to target)
  const gaps = [
    { name: 'Verfügbarkeit', gap: targets.targetAvailability - current.availability, action: 'Ungeplante Stillstände analysieren — präventive Wartungsintervalle und Ersatzteilversorgung prüfen.' },
    { name: 'Leistung',      gap: targets.targetPerformance  - current.performance,  action: 'Taktzeit überprüfen und Kleinstopps erfassen — Mikrostopps werden oft nicht gemeldet.' },
    { name: 'Qualität',      gap: targets.targetQuality      - current.quality,      action: 'Fehlerursachenanalyse (8D/Ishikawa) für Ausschuss einleiten — Prüfplan anpassen.' },
  ].sort((a, b) => b.gap - a.gap)

  const main = gaps[0]
  if (main.gap > 0.01) {
    lines.push(`Hauptverlustquelle: ${main.name} (Abstand zum Ziel: ${(main.gap * 100).toFixed(1)} PP).`)
    lines.push(`Empfehlung: ${main.action}`)
  } else {
    lines.push('Alle OEE-Komponenten liegen am oder über dem Zielwert — sehr gute Performance.')
  }

  // 3 — Week-over-week
  if (previous) {
    const weekDelta = (current.oee - previous.oee) * 100
    const dir = weekDelta >= 0 ? 'verbessert' : 'verschlechtert'
    lines.push(
      `Im Vergleich zur Vorwoche hat sich die OEE um ${Math.abs(weekDelta).toFixed(1)} PP ${dir}.`
    )
    // Largest factor swing
    const swings = [
      { name: 'Verfügbarkeit', delta: (current.availability - previous.availability) * 100 },
      { name: 'Leistung',      delta: (current.performance  - previous.performance)  * 100 },
      { name: 'Qualität',      delta: (current.quality      - previous.quality)      * 100 },
    ].sort((a, b) => Math.abs(b.delta) - Math.abs(a.delta))
    const biggest = swings[0]
    if (Math.abs(biggest.delta) > 0.5) {
      const sign = biggest.delta >= 0 ? '+' : ''
      lines.push(
        `Größte Einzelveränderung: ${biggest.name} (${sign}${biggest.delta.toFixed(1)} PP zur Vorwoche).`
      )
    }
  }

  // 4 — 4-week trend
  if (trendHistory && trendHistory.length >= 4) {
    const slice = trendHistory.slice(-4)
    const trendDelta = (slice[slice.length - 1].oee - slice[0].oee) * 100
    const trendDir = trendDelta >= 0 ? 'verbessert' : 'verschlechtert'
    lines.push(
      `Trend (letzte 4 Wochen): OEE hat sich um ${Math.abs(trendDelta).toFixed(1)} PP ${trendDir}.`
    )
  }

  return lines
}
