import Post from "../models/Posts";
import React, { createContext, useContext, useState, ReactNode, useEffect } from 'react';
import { useParams, useNavigate } from 'react-router-dom';
import {fetchPosts} from "../services/api/jsonplaceholder/posts";

type PostContextType = {
    post: Post | null;
}

const PostContext = createContext<PostContextType | undefined>(undefined);

interface PostContextProviderProps {
    children: ReactNode;
}

const PostContextProvider: React.FC<PostContextProviderProps> = ({ children }) => {
    const [post, setPost] = useState<Post | null>(null);

    const navigate = useNavigate();
    const { postId } = useParams<{ postId: string }>();

    // Valide l'ID du post et redirige vers la page 404 si nécessaire
    const validateAndSetPost = async (postId: string) => {
        const postIdInt = parseInt(postId, 10);

        if (Number.isInteger(postIdInt) && postIdInt > 0) {
            // ID valide, fetch le post depuis l'API
            const data = await fetchPosts(postIdInt);

            if (data) {
                setPost(data);
            } else {
                // En cas d'erreur lors de la récupération du post, redirige vers la page 404
                navigate('/not-found', { replace: true });
            }
        } else {
            // ID invalide, redirige vers la page 404
            navigate('/not-found', { replace: true });
        }
    };

    // Expose le contexte avec le post actuel
    const contextValue: PostContextType = {
        post
    };

    // Valide et set le post lors du montage du composant
    useEffect(() => {
        validateAndSetPost(postId || '');
    }, [postId]);

    return <PostContext.Provider value={contextValue}>{children}</PostContext.Provider>;
};

// Hook personnalisé pour accéder au contexte
const usePostContext = () => {
    const context = useContext(PostContext);
    if (!context) {
        throw new Error('usePostContext doit être utilisé à l\'intérieur de PostContextProvider');
    }
    return context;
};

export { PostContextProvider, usePostContext };