/**
 * Explainable AI copy generation (§8).
 *
 * The narrative shown beside a prediction is assembled from the same factor breakdown the
 * risk engine produced, so the sentence and the bar chart underneath it can never
 * disagree. Shared by the seed script and the live console for exactly that reason.
 */

import type { Locale } from '../domain/enums'
import type { RiskAssessment, RiskFactorKey } from './risk'
import type { AssetProfile, TelemetrySample } from './telemetry'

export interface FactorCopy {
  label: string
  labelAr: string
  detail: string
  detailAr: string
}

export const FACTOR_COPY: Record<RiskFactorKey, FactorCopy> = {
  anomaly: {
    label: 'Deviation from expected behaviour',
    labelAr: 'انحراف عن السلوك المتوقع',
    detail:
      'The asset is running hotter or more heavily loaded than the digital twin expects for this asset at this hour.',
    detailAr:
      'يعمل الأصل بحرارة أو تحميل أعلى مما يتوقعه التوأم الرقمي لهذا الأصل في هذه الساعة.',
  },
  dna: {
    label: 'Failure DNA similarity',
    labelAr: 'تشابه بصمة العطل',
    detail:
      'The present signature resembles a recorded failure across the ten monitored dimensions.',
    detailAr: 'تشبه البصمة الحالية عطلًا مسجلًا عبر الأبعاد العشرة المراقَبة.',
  },
  load: {
    label: 'Loading above the stress threshold',
    labelAr: 'تحميل يتجاوز عتبة الإجهاد',
    detail: 'Loading has passed the point where thermal margin starts to erode quickly.',
    detailAr: 'تجاوز التحميل النقطة التي يبدأ عندها الهامش الحراري بالتآكل السريع.',
  },
  thermal: {
    label: 'Temperature relative to rating',
    labelAr: 'الحرارة نسبةً إلى التصنيف',
    detail:
      'Top-oil temperature is approaching the asset rated value, where insulation ageing accelerates.',
    detailAr: 'تقترب حرارة الزيت العلوي من القيمة المصنّفة، حيث يتسارع تقادم العزل.',
  },
  weather: {
    label: 'Ambient conditions',
    labelAr: 'الظروف الجوية',
    detail:
      'Air temperature and dust reduce cooling effectiveness and raise cooling demand at the same time.',
    detailAr: 'ترفع حرارة الجو والغبار الطلب على التبريد وتخفض كفاءته في آن واحد.',
  },
}

export function factorLabel(key: RiskFactorKey, locale: Locale): string {
  return locale === 'ar' ? FACTOR_COPY[key].labelAr : FACTOR_COPY[key].label
}

export function factorDetail(key: RiskFactorKey, locale: Locale): string {
  return locale === 'ar' ? FACTOR_COPY[key].detailAr : FACTOR_COPY[key].detail
}

export interface ExplanationInput {
  profile: AssetProfile
  sample: TelemetrySample
  risk: RiskAssessment
  dnaSimilarity: number
  etaMinutes: number | null
  confidence: number
}

/**
 * A plain-language summary of why the score is what it is.
 *
 * Written as a statement of measurements rather than a verdict: it names the three
 * largest contributors with their point values, so an engineer can check the claim
 * against the table beside it instead of taking it on trust.
 */
export function describePrediction(input: ExplanationInput, locale: Locale): string {
  const top = input.risk.topFactors.slice(0, 3)

  if (locale === 'ar') {
    const drivers = top
      .map((factor) => `${FACTOR_COPY[factor.key].labelAr} (${factor.contribution.toFixed(1)} نقطة)`)
      .join('، ')
    const eta =
      input.etaMinutes === null
        ? 'ولا يُتوقع تجاوز أي حد تشغيلي خلال أفق التنبؤ الحالي'
        : `ويُتوقع تجاوز أول حد تشغيلي خلال ${input.etaMinutes} دقيقة`
    return (
      `يعمل الأصل ${input.profile.code} عند تحميل ${input.sample.loadPct.toFixed(0)}٪ ` +
      `وحرارة ${input.sample.tempC.toFixed(0)} مئوية. ` +
      `أكبر مساهمات درجة الخطر البالغة ${input.risk.score.toFixed(0)}٪ هي: ${drivers}. ` +
      `تبلغ درجة التشابه مع أقرب بصمة عطل تاريخية ${input.dnaSimilarity.toFixed(0)}٪، ` +
      `${eta}، بثقة ${(input.confidence * 100).toFixed(0)}٪.`
    )
  }

  const drivers = top
    .map((factor) => `${FACTOR_COPY[factor.key].label} (${factor.contribution.toFixed(1)} pts)`)
    .join(', ')
  const eta =
    input.etaMinutes === null
      ? 'no operating limit is crossed inside the current prediction horizon'
      : `the first operating limit is crossed in about ${input.etaMinutes} minutes`

  return (
    `${input.profile.code} is running at ${input.sample.loadPct.toFixed(0)} % loading and ` +
    `${input.sample.tempC.toFixed(0)} °C. The largest contributors to the ` +
    `${input.risk.score.toFixed(0)} % risk score are: ${drivers}. Its closest historical failure ` +
    `signature matches at ${input.dnaSimilarity.toFixed(0)} %, and ${eta}, at ` +
    `${(input.confidence * 100).toFixed(0)} % confidence.`
  )
}
