export type ClimateProjectionZone = {
  tempMoyEstivale: number;
  tempMoyEstivale10ans: number;
  tempMoyEstivale20ans: number;
  joursSup30C: number;
  joursSup30C10ans: number;
  joursSup30C20ans: number;
};

export type HeatTimelineYear = {
  year: number;
  progress: number;
  label: string;
};

export type ClimateScrollProjection = {
  progress: number;
  year: number;
  temp: number;
  days: number;
  tempDelta: number;
  dayDelta: number;
  heatLevel: number;
  title: string;
  text: string;
  impact1: string;
  impact2: string;
};

export const HEAT_TIMELINE_YEARS: HeatTimelineYear[] = [
  { year: 2026, progress: 0, label: 'Référence' },
  { year: 2031, progress: 0.25, label: 'Tension' },
  { year: 2036, progress: 0.5, label: 'Bascule' },
  { year: 2041, progress: 0.75, label: 'Rupture' },
  { year: 2046, progress: 1, label: 'Adaptation' },
];

const SCENES = [
  {
    progress: 0,
    title: "L'été commence à peser",
    text: 'La toiture absorbe, l’intérieur chauffe, le confort recule.',
    impact1: 'Fatigue plus précoce',
    impact2: 'Climatisation plus fréquente',
  },
  {
    progress: 0.25,
    title: 'Les pics deviennent la norme',
    text: 'Chaque été ajoute des journées critiques au calendrier d’exploitation.',
    impact1: 'Pauses plus fréquentes',
    impact2: 'Groupes froids sous tension',
  },
  {
    progress: 0.5,
    title: 'La chaleur ne passe plus inaperçue',
    text: 'Les épisodes chauds deviennent plus longs, plus fréquents, plus coûteux.',
    impact1: 'Concentration en baisse',
    impact2: 'Besoins en refroidissement en hausse',
  },
  {
    progress: 0.75,
    title: 'La marge de confort disparaît',
    text: 'La surchauffe n’est plus ponctuelle : elle structure les coûts d’été.',
    impact1: 'Rythme de travail fragilisé',
    impact2: 'Exploitation plus chère',
  },
  {
    progress: 1,
    title: "L'adaptation devient incontournable",
    text: 'La toiture n’est plus un simple support : elle devient un levier de performance.',
    impact1: 'Surchauffe et rythme de travail dégradé',
    impact2: 'Refroidir plus souvent, plus longtemps, plus cher',
  },
];

function clamp01(value: number): number {
  return Math.max(0, Math.min(1, Number.isFinite(value) ? value : 0));
}

function lerp(a: number, b: number, t: number): number {
  return a + (b - a) * t;
}

function interpolateMilestone(start: number, middle: number, end: number, progress: number): number {
  if (progress <= 0.5) {
    return lerp(start, middle, progress / 0.5);
  }

  return lerp(middle, end, (progress - 0.5) / 0.5);
}

function getScene(progress: number) {
  return SCENES.reduce((current, scene) => (progress >= scene.progress ? scene : current), SCENES[0]);
}

export function getClimateScrollProjection(
  zone: ClimateProjectionZone,
  rawProgress: number,
): ClimateScrollProjection {
  const progress = clamp01(rawProgress);
  const year = Math.round(lerp(2026, 2046, progress));
  const temp = interpolateMilestone(
    zone.tempMoyEstivale,
    zone.tempMoyEstivale10ans,
    zone.tempMoyEstivale20ans,
    progress,
  );
  const days = Math.round(interpolateMilestone(
    zone.joursSup30C,
    zone.joursSup30C10ans,
    zone.joursSup30C20ans,
    progress,
  ));
  const scene = getScene(progress);

  return {
    progress,
    year,
    temp: Number(temp.toFixed(1)),
    days,
    tempDelta: Number((temp - zone.tempMoyEstivale).toFixed(1)),
    dayDelta: days - zone.joursSup30C,
    heatLevel: progress,
    title: scene.title,
    text: scene.text,
    impact1: scene.impact1,
    impact2: scene.impact2,
  };
}

export function getHeatTimelineMarkers(zone: ClimateProjectionZone) {
  return HEAT_TIMELINE_YEARS.map((marker) => ({
    ...marker,
    projection: getClimateScrollProjection(zone, marker.progress),
  }));
}
