import { useState, useCallback, type ReactNode } from 'react';
import { AuthContext } from './AuthContext';
import { sha512 } from '../utils/crypto';

// Nazwa klucza w localStorage (musi być spójna z Generator.tsx)
const TOKEN_KEY = 'jwt_token';

// Adres API
const API_BASE = import.meta.env.VITE_API_TARGET || 'https://ktty.is';

export function AuthProvider({ children }: { children: ReactNode }) {
    // Inicjalizacja stanu
    const [token, setToken] = useState<string | null>(() => localStorage.getItem(TOKEN_KEY));
    const [loading, setLoading] = useState(false);
    const [error, setError] = useState<string | null>(null);

    const authRequest = useCallback(async (endpoint: 'signIn' | 'signUp', name: string, pass: string) => {
        setLoading(true);
        setError(null);

        try {
            const hashedPassword = await sha512(pass);

            const response = await fetch(`${API_BASE}/api/v1/user/${endpoint}`, {
                method: 'POST',
                headers: { 'Content-Type': 'application/json' },
                body: JSON.stringify({ name, password: hashedPassword }),
            });

            const data = await response.json();

            if (!response.ok) {
                throw new Error(data?.message || data?.error || 'Błąd autoryzacji');
            }

            if (data?.token) {
                localStorage.setItem(TOKEN_KEY, data.token);
                setToken(data.token);
            }

            return data;

        } catch (err: unknown) {
            const msg = err instanceof Error ? err.message : 'Wystąpił błąd';
            setError(msg);
            return null;
        } finally {
            setLoading(false);
        }
    }, []);

    // ZMODYFIKOWANA FUNKCJA LOGOUT
    const logout = useCallback(() => {
        // 1. Usuwamy token z pamięci
        localStorage.removeItem(TOKEN_KEY);
        setToken(null);

        // 2. Wymuszamy odświeżenie aplikacji
        // To jest "Hard Refresh", który czyści cały stan Reacta
        window.location.reload();

        // Opcjonalnie: Jeśli wolisz tylko przekierowanie na główną bez pełnego przeładowania (szybciej, ale zostawia stan w pamięci):
        // window.location.href = '/'; 
    }, []);

    return (
        <AuthContext.Provider value={{
            isAuthenticated: !!token,
            token,
            loading,
            error,
            signIn: (n, p) => authRequest('signIn', n, p),
            signUp: (n, p) => authRequest('signUp', n, p),
            logout
        }}>
            {children}
        </AuthContext.Provider>
    );
}