"use client"

import { useState, useEffect } from "react"
import { motion, useMotionValue, useTransform, animate } from "framer-motion"
import { useRevelationInView } from "@/lib/panel-reveal"
import { useTranslations, useLocale } from "next-intl"
import Image from "next/image"
import SectionLabel from "@/components/section-label"

type Service = {
  nameFr: string
  nameEn: string
  introFr: string
  introEn: string
  itemsFr: string[]
  itemsEn: string[]
}

const SERVICES: Service[] = [
  {
    nameFr: "Service inspection",
    nameEn: "Inspection Department",
    introFr:
      "Tuyauteries, colonnes et réservoirs sont soumis en permanence à la pression et à la température. Le service Inspection garantit leur intégrité et leur conformité tout au long de leur exploitation :",
    introEn:
      "Piping, columns and vessels are permanently subject to pressure and temperature. The Inspection Department safeguards their integrity and compliance throughout their service life:",
    itemsFr: [
      "Établir les plans d'inspection adaptés aux risques évalués pour chaque équipement",
      "Contrôler les équipements et leurs accessoires de sécurité, et vérifier leur conformité réglementaire",
      "Préconiser la nature et les dates des interventions préventives de maintenance ou de remplacement",
    ],
    itemsEn: [
      "Drawing up inspection plans matched to the assessed risk of each item of equipment",
      "Inspecting equipment and its safety accessories, and verifying regulatory compliance",
      "Recommending the nature and timing of preventive maintenance or replacement work",
    ],
  },
  {
    nameFr: "Service sûreté",
    nameEn: "Security Department",
    introFr:
      "La raffinerie constitue une infrastructure sensible à l'échelle nationale. Le service Sûreté en assure la protection contre les actes malveillants :",
    introEn:
      "The refinery is a facility of national significance. The Security Department ensures its protection against malicious acts:",
    itemsFr: [
      "Assurer la surveillance permanente de l'usine, des postes de chargement et des pipelines",
      "Gérer les accès à la raffinerie et contrôler les entrées et sorties",
      "Assurer l'interface avec les forces de défense et de sécurité",
    ],
    itemsEn: [
      "Maintaining permanent surveillance of the plant, loading stations and pipelines",
      "Managing access to the refinery and controlling entries and exits",
      "Acting as the interface with the defence and security forces",
    ],
  },
  {
    nameFr: "Service sécurité",
    nameEn: "Safety Department",
    introFr:
      "Les procédés mettent en œuvre chaque jour des produits inflammables. Le service Sécurité assure la protection des personnes et des installations :",
    introEn:
      "Refining operations handle flammable products every day. The Safety Department ensures the protection of people and installations:",
    itemsFr: [
      "Évaluer les risques liés aux activités et les maîtriser avec l'ensemble des acteurs",
      "Analyser chaque incident, même sans conséquence, afin d'en prévenir la répétition",
      "Conduire les exercices de simulation des situations d'urgence et maintenir la capacité d'intervention",
    ],
    itemsEn: [
      "Assessing the risks associated with operations and controlling them with all stakeholders",
      "Analysing every incident, even one without consequence, to prevent any recurrence",
      "Running emergency simulation exercises and maintaining response capability",
    ],
  },
  {
    nameFr: "Service environnement",
    nameEn: "Environment Department",
    introFr:
      "L'activité de raffinage transforme la matière et consomme de l'énergie. Le service Environnement en évalue les impacts, les maîtrise et en rend compte, année après année :",
    introEn:
      "Refining transforms matter and consumes energy. The Environment Department assesses its impacts, controls them and reports on them, year after year:",
    itemsFr: [
      "Évaluer les impacts des activités sur l'air, l'eau et les sols",
      "Surveiller les rejets et vérifier leur conformité aux prescriptions du code de l'environnement",
      "Assurer la gestion et le tri des déchets, liquides comme solides",
    ],
    itemsEn: [
      "Assessing the impact of operations on air, water and soil",
      "Monitoring discharges and verifying their compliance with environmental regulations",
      "Managing and sorting waste, both liquid and solid",
    ],
  },
]

/** L'ordre d'affichage : inspection et sûreté au-dessus de la photo, sécurité et
 *  environnement en dessous. Sûreté et sécurité restent voisines, c'est leur
 *  voisinage qui lève la confusion entre les deux mots. Les index renvoient à
 *  SERVICES, déclaré dans l'ordre du document source. */
const ORDRE = [0, 1, 2, 3]

/** Ce que veille chaque service, dans l'ordre de SERVICES. Deux lignes de
 *  lecture suffisent : l'objet, puis ce contre quoi il protège. */
const OBJETS = [
  { fr: "L’intégrité des équipements sous pression", en: "The integrity of pressure equipment" },
  { fr: "Les installations et les accès, face aux actes malveillants", en: "Installations and access points, against malicious acts" },
  { fr: "Les personnes et les opérations, face au risque d’accident", en: "People and operations, against the risk of accident" },
  { fr: "L’air, l’eau et les sols, au-delà des limites du site", en: "Air, water and soil, beyond the site boundary" },
]

export default function SecuritySection() {
  const t = useTranslations("activites")
  // Les deux referentiels qui engagent cette section : sante et securite au
  // travail, et management environnemental. Ils sont deja publies sur le site,
  // rien n'est ajoute au fond, seul l'endroit change.
  const tCert = useTranslations("certifications")
  const locale = useLocale()
  const isEn = locale === "en"
  const [ref, inView] = useRevelationInView({ triggerOnce: true, threshold: 0.1 })
  const [daysWithoutAccident, setDaysWithoutAccident] = useState<number>(3269)

  // Compteur animé (jours sans accident)
  const count = useMotionValue(0)
  const displayedCount = useTransform(count, (v) => Math.round(v).toLocaleString("fr-FR"))

  useEffect(() => {
    if (!inView) return
    const run = () => {
      count.set(0)
      animate(count, daysWithoutAccident, { duration: 2.5, ease: [0.16, 1, 0.3, 1] })
    }
    run()
    const interval = setInterval(run, 10000)
    return () => clearInterval(interval)
  }, [inView, daysWithoutAccident])

  useEffect(() => {
    const API_URL = process.env.NEXT_PUBLIC_API_URL || "http://localhost:8000"
    fetch(`${API_URL}/api/safety/days-without-accident`)
      .then((res) => (res.ok ? res.json() : Promise.reject()))
      .then((data: { days_without_accident: number }) => setDaysWithoutAccident(data.days_without_accident))
      .catch(() => {})
  }, [])

  /** Un metier, dans une carte au gabarit de celle de la page Fondation :
   *  etiquette pleine en haut a gauche, intitule, texte d'introduction, puis
   *  les missions en entrees a puce rouge separees par des filets. */
  const metier = (idx: number) => {
    const s = SERVICES[idx]
    const nom = isEn
      ? s.nameEn.replace(" Department", "")
      : (() => {
          const w = s.nameFr.replace("Service ", "")
          return w.charAt(0).toUpperCase() + w.slice(1)
        })()
    return (
      <div
        key={idx}
        className="relative border-2 border-gray-200 bg-white px-5 pb-5 pt-11 sm:px-7 sm:pb-6 sm:pt-12"
      >
        <p className="absolute left-0 top-0 bg-primary px-4 py-2 text-sm font-bold uppercase tracking-[0.06em] text-white">
          {nom}
        </p>

        <h3 className="text-[15px] font-bold leading-snug text-gray-900 sm:text-base">
          {isEn ? OBJETS[idx].en : OBJETS[idx].fr}
        </h3>
        <p className="mt-2 text-[13px] leading-[1.7] text-gray-600">
          {isEn ? s.introEn : s.introFr}
        </p>

        <ul className="mt-2 divide-y divide-neutral-100">
          {(isEn ? s.itemsEn : s.itemsFr).map((it, k) => (
            <li key={k} className="flex items-start gap-2.5 py-2.5">
              <span className="mt-[7px] h-1.5 w-1.5 flex-shrink-0 rounded-full bg-primary/60" aria-hidden />
              <p className="text-[12.5px] leading-snug text-neutral-700">{it}</p>
            </li>
          ))}
        </ul>
      </div>
    )
  }

  return (
    // flex-1 et marges annulées : dans un panneau d'onglets, la section remplit
    // la hauteur pour que son titre se cale en haut plutôt que d'être poussé au
    // milieu par le `my-auto` du panneau. Inerte hors panneau.
    <section
      id="safety"
      className="flex flex-1 flex-col pt-8 sm:pt-10 md:pt-12 pb-10 sm:pb-12 bg-white relative overflow-hidden scroll-mt-[calc(var(--h-navbar)_+_var(--h-onglets))]"
      style={{ marginTop: 0, marginBottom: 0 }}
      ref={ref}
    >
      <div className="px-2 sm:px-4 lg:px-6">
        <div className="max-w-[98%] mx-auto">
          <SectionLabel title={t("security.sectionTitle")} size="small" variant="overline" />
        </div>
      </div>

      <div className="max-w-7xl w-full mx-auto px-3 sm:px-4 md:px-6 lg:px-8 mt-6 sm:mt-8">

        {/* La photo a gauche, le compteur a droite. Le nombre ne s'ecrit plus
            sur l'image : elle doit garder la luminosite des vues de l'etat des
            lieux, et du blanc sur une photo claire impose des ombres portees
            qui ne tiennent jamais tout a fait. Les deux blocs ont la meme
            hauteur, ils se lisent comme un seul bandeau. */}
        <motion.div
          initial={{ opacity: 0, y: 24 }}
          animate={inView ? { opacity: 1, y: 0 } : {}}
          transition={{ duration: 0.7, ease: [0.22, 1, 0.36, 1] }}
          className="grid gap-6 lg:grid-cols-[1.6fr_1fr] lg:gap-8"
        >
          <div>
            <div className="relative h-[240px] sm:h-[300px] lg:h-[360px] overflow-hidden shadow-xl">
              <Image
                src="/sapeur.png"
                alt="Sapeur-pompier de la SAR en manœuvre sur un canon à mousse"
                fill
                className="object-cover"
                sizes="(max-width: 1024px) 100vw, 780px"
                priority
              />
            </div>
          </div>

          <motion.div
            initial={{ opacity: 0, x: 20 }}
            animate={inView ? { opacity: 1, x: 0 } : {}}
            transition={{ duration: 0.6, delay: 0.25 }}
            /* Meme cadre gris que les quatre metiers en dessous : le compteur
               cesse de flotter a cote de la photo, la section entiere partage
               un gabarit. */
            className="flex flex-col justify-center border-2 border-gray-200 px-4 py-6 text-center sm:px-6 lg:h-[364px]"
          >
            <motion.span className="block text-5xl font-extrabold leading-none tabular-nums text-primary sm:text-6xl">
              {displayedCount}
            </motion.span>
            <span className="mx-auto mt-4 block h-0.5 w-10 bg-primary/70" aria-hidden />
            <span className="mt-4 block text-[11px] font-bold uppercase tracking-[0.18em] leading-relaxed text-gray-500 sm:text-xs">
              {t("security.accidentFreeDays.label")}
            </span>

            {/* Ce chiffre ne tient pas seul : il repose sur deux referentiels
                certifies, que la colonne rappelle sous lui. */}
            <div className="mx-auto mt-8 w-full max-w-[15rem] border-t border-neutral-200 pt-6">
              <dl className="space-y-4">
                {["iso45001", "iso14001"].map((cle) => (
                  <div key={cle}>
                    <dt className="text-[13px] font-bold tracking-wide text-primary">
                      {tCert(`${cle}.title`)}
                    </dt>
                    <dd className="mt-1 text-[11.5px] uppercase tracking-[0.12em] text-gray-500">
                      {tCert(`${cle}.subtitle`)}
                    </dd>
                  </div>
                ))}
              </dl>
            </div>
          </motion.div>
        </motion.div>

        {/* Les quatre metiers, en colonnes separees par des filets. La marge
            haute degage le cartouche, qui deborde du bandeau. */}
        <motion.div
          initial={{ opacity: 0, y: 20 }}
          animate={inView ? { opacity: 1, y: 0 } : {}}
          transition={{ duration: 0.6, delay: 0.2 }}
          className="mt-12 grid items-stretch gap-6 sm:grid-cols-2 sm:gap-8 lg:mt-14 lg:grid-cols-4"
        >
          {ORDRE.map(metier)}
        </motion.div>
      </div>

    </section>
  )
}
