import { useProgressStore } from '../stores/progressStore';
import { useState, useCallback, useEffect } from 'react';

interface UseEjercicioProgresoOptions {
  moduloId: string;
  ejercicioId: string;
  onComplete?: (puntuacion?: number) => void;
}

interface UseEjercicioProgresoReturn {
  guardarProgreso: (puntuacion: number) => Promise<void>;
  progresoGuardado: boolean;
  puntuacionAnterior: number | undefined;
  intentos: number;
  isLoading: boolean;
  error: string | null;
}

export function useEjercicioProgreso({
  moduloId,
  ejercicioId,
  onComplete,
}: UseEjercicioProgresoOptions): UseEjercicioProgresoReturn {
  const { saveProgreso, getProgresoEjercicio, modulos } = useProgressStore();
  const [progresoGuardado, setProgresoGuardado] = useState(false);
  const [isLoading, setIsLoading] = useState(false);
  const [error, setError] = useState<string | null>(null);
  const [puntuacionAnterior, setPuntuacionAnterior] = useState<number | undefined>(undefined);
  const [intentos, setIntentos] = useState(0);

  // Cargar progreso existente de manera reactiva
  useEffect(() => {
    const progreso = getProgresoEjercicio(moduloId, ejercicioId);
    if (progreso) {
      setPuntuacionAnterior(progreso.puntuacion);
      setIntentos(progreso.intentos);
    } else {
      setPuntuacionAnterior(undefined);
      setIntentos(0);
    }
  }, [moduloId, ejercicioId, getProgresoEjercicio, modulos]);

  const guardarProgreso = useCallback(async (puntuacion: number) => {
    setIsLoading(true);
    setError(null);

    try {
      // Guardar en el store (que ahora usa la API)
      await saveProgreso(moduloId, ejercicioId, puntuacion);

      setProgresoGuardado(true);

      // Actualizar estado local
      const progresoAnterior = getProgresoEjercicio(moduloId, ejercicioId);
      if (progresoAnterior) {
        setPuntuacionAnterior(progresoAnterior.puntuacion);
        setIntentos(progresoAnterior.intentos);
      } else {
        setPuntuacionAnterior(puntuacion);
        setIntentos(1);
      }

      // Llamar callback si existe
      if (onComplete) {
        onComplete(puntuacion);
      }
    } catch (err) {
      setError(err instanceof Error ? err.message : 'Error al guardar el progreso');
      console.error('Error saving progress:', err);
    } finally {
      setIsLoading(false);
    }
  }, [moduloId, ejercicioId, saveProgreso, onComplete, getProgresoEjercicio]);

  return {
    guardarProgreso,
    progresoGuardado,
    puntuacionAnterior,
    intentos,
    isLoading,
    error,
  };
}

export default useEjercicioProgreso;
