import React, { useState, useEffect, useContext } from 'react';
import { View, ScrollView, StyleSheet } from 'react-native';
import { Symptome } from '@/constants/type';
import { useLocalSearchParams, useRouter } from 'expo-router';
import {
  filteredSuivi,
  formatDate,
  parsedPathologiesWithSymptomsType,
} from '@/constants/constants';
import Button from '@/components/Button';
import { InputBox } from '@/components/AssessSymptom';
import { useUsers } from '@/contexts/UserContext';
import i18n from '@/i18n/config';
import AutoResizeText from '@/components/AutoResizeText';
import * as Location from 'expo-location';
import { useAppData } from '@/contexts/AppDataContext';


const SymptomsAssociatedSimple: React.FC = () => {
  const { fichier4a: fichier_4a, fichier8a: fichier_8a } = useAppData();
  const { evaluateur, id_suivi } =
    useLocalSearchParams<{ evaluateur?: string; id_suivi?: any }>();

  const router = useRouter();
  const {
    currentUser,
    addDataToGlobal,
    volatileData,
    clearVolatile,
  } = useUsers();

  const [commitRequested, setCommitRequested] = useState(false);
  const [symptomsArray, setSymptomsArray] = useState<Symptome[]>([]);

  const pathId = Number(id_suivi);
  const pathologieEntry =
    filteredSuivi.find(p => p.id === pathId) ?? null;
  const symptoms = pathologieEntry
    ? (pathologieEntry.symptoms as Symptome[])
    : [];

  /* ──────────────────────────────
     Reset when path changes
  ────────────────────────────── */
  useEffect(() => {
    setSymptomsArray([]);
  }, [pathId]);

  /* ──────────────────────────────
     Handlers
  ────────────────────────────── */

  const handleTextInputChange = (id: number, value: string | number) => {
    setSymptomsArray(prev => {
      const existing = prev.find(s => s.id === id);
      if (existing) {
        return prev.map(s =>
          s.id === id
            ? { ...s, data: [{ date: new Date(), valeur: value }] }
            : s
        );
      }
      const sym = symptoms.find(s => s.id === id);
      return sym
        ? [...prev, { ...sym, data: [{ date: new Date(), valeur: value }] }]
        : prev;
    });
  };

  const handleValidatePress = async () => {
    if (!volatileData || Object.keys(volatileData).length === 0) return;

    // ──────────────────────────────
    // 1. Géolocalisation
    // ──────────────────────────────
    let latitude = null;
    let longitude = null;

    try {
      const { status } = await Location.requestForegroundPermissionsAsync();
      if (status === 'granted') {
        const loc = await Location.getCurrentPositionAsync({});
        latitude = loc.coords.latitude;
        longitude = loc.coords.longitude;
      }
    } catch (e) {
      console.log("Erreur localisation :", e);
    }

    // ──────────────────────────────
    // 2. Sauvegarde dans globalData (pas de bilan)
    // ──────────────────────────────
    Object.entries(volatileData).forEach(([id, valeur]) => {
      addDataToGlobal(Number(id), {
        date: new Date(),
        valeur,
        latitude,
        longitude,
        evaluateur: currentUser?.evaluateur ?? null,
        patient: currentUser?.username ?? null,
      });
    });

    // ──────────────────────────────
    // 3. Nettoyage
    // ──────────────────────────────
    clearVolatile();

    // ──────────────────────────────
    // 4. Retour à l’accueil
    // ──────────────────────────────
    router.push('/(tabs)');
  };

  const handleValidatePressChoose = async () => {
    setCommitRequested(true);
    await handleValidatePress();
  };

  /* ──────────────────────────────
     Render
  ────────────────────────────── */

  return (
    <ScrollView contentContainerStyle={{ paddingBottom: 80 }}>
      <>
        {symptoms.map((symptom, index) => {
          // @ts-ignore: globalData est une Map en mémoire
          const initialSliderValue =
            currentUser?.globalData?.[symptom.id]?.values?.at(-1)
              ?.valeur;

          const lastValueDate =
            symptom.data?.[symptom.data.length - 1]?.date;

          const formattedDate = lastValueDate
            ? formatDate(new Date(lastValueDate))
            : null;

          return (
            <View
              key={`${symptom.id}-${index}`}
              style={{ padding: 20 }}
            >
              <AutoResizeText
                text={symptom.surname ?? symptom.name ?? ''}
                maxFontSize={20}
                minFontSize={5}
                style={{ marginBottom: 10 }}
              />

              <InputBox
                s={symptom}
                evaluateur={evaluateur?.toString()}
                onClose={() => {}}
                noText
                donotdispVButtons
                ouinonSameLine
                initsetSliderValue={
                  typeof initialSliderValue === 'number'
                    ? initialSliderValue
                    : null
                }
                lastValueDate={formattedDate}
                recupSliderValue={v =>
                  handleTextInputChange(symptom.id, v as number)
                }
                recupYesNo={v =>
                  handleTextInputChange(symptom.id, v ? 1 : 0)
                }
                initsetTexteValue={
                  // @ts-ignore
                  currentUser?.globalData?.[symptom.id]?.values?.at(-1)
                    ?.valeur
                    ? String(
                        // @ts-ignore
                        currentUser.globalData[symptom.id].values.at(-1)
                          .valeur
                      )
                    : undefined
                }
                commitRequested={commitRequested}
              />
            </View>
          );
        })}
      </>

      <Button
        isSelected
        onPress={handleValidatePressChoose}
        text={i18n.t('commons.validate')}
      />
    </ScrollView>
  );
};

const styles = StyleSheet.create({});

export default SymptomsAssociatedSimple;
