'use client';

import { useState, useEffect, useCallback } from 'react';
import { UserProgress, WordAttempt } from '@/types';

const STORAGE_KEY = 'spellstar-progress';

const defaultProgress: UserProgress = {
  masteredWords: [],
  attempts: {},
  totalStars: 0,
  lastPlayed: '',
};

export function useProgress() {
  const [progress, setProgress] = useState<UserProgress>(defaultProgress);
  const [loaded, setLoaded] = useState(false);

  useEffect(() => {
    try {
      const stored = localStorage.getItem(STORAGE_KEY);
      if (stored) setProgress(JSON.parse(stored));
    } catch {
      // ignore parse errors
    }
    setLoaded(true);
  }, []);

  const recordAttempt = useCallback((wordId: string, correct: boolean) => {
    setProgress(prev => {
      const existing: WordAttempt = prev.attempts[wordId] ?? {
        correct: 0,
        incorrect: 0,
        lastSeen: '',
      };

      const updated: WordAttempt = {
        correct: existing.correct + (correct ? 1 : 0),
        incorrect: existing.incorrect + (correct ? 0 : 1),
        lastSeen: new Date().toISOString(),
      };

      let masteredWords = [...prev.masteredWords];
      if (correct && updated.correct >= 3 && !masteredWords.includes(wordId)) {
        masteredWords = [...masteredWords, wordId];
      }

      const next: UserProgress = {
        ...prev,
        attempts: { ...prev.attempts, [wordId]: updated },
        masteredWords,
        totalStars: prev.totalStars + (correct ? 1 : 0),
        lastPlayed: new Date().toISOString(),
      };

      localStorage.setItem(STORAGE_KEY, JSON.stringify(next));
      return next;
    });
  }, []);

  const resetProgress = useCallback(() => {
    localStorage.removeItem(STORAGE_KEY);
    setProgress(defaultProgress);
  }, []);

  return { progress, recordAttempt, resetProgress, loaded };
}
