import React, { useEffect } from "react";
import { useState } from "react";
import { Credentials, User, TokenData } from "../Types";
import { useNavigate } from "react-router-dom";
import { fetchUserById, logIn } from "../Api";
import { tokenStatus } from "../Api";
import jwt_decode from "jwt-decode";

export const useAuthenticateUser = () => {
	const [isLoading, setIsLoading] = useState(false);
	const [isAirline, setIsAirline] = useState(false);
	const [user, setUser] = useState<User | null>(null);
	const [error, setError] = useState<string | null>(null);
    const [tokenValidated, setTokenValidated] = useState(false);

	const navigate = useNavigate();

	const authenticate = async (credentials: Credentials): Promise<void> => {
		if (!user) {
			try {
				setIsLoading(true);
				setError(null);

				const tokens = await logIn(credentials);
				localStorage.setItem("token", tokens.access_token);
                const airline = (jwt_decode(tokens.access_token) as TokenData).airline;
                setIsAirline(airline)

				if (tokens.user_id) {
					const user = await fetchUserById(tokens.user_id);
					setUser(user);
				} else {
					setError(tokens.message!.split(".")[0] + ".");
					setUser(null);
				}
			} catch (error) {
				setError(error as string);
			} finally {
				setIsLoading(false);
                navigate("/home")
			}
		}
	};

	const validateToken = async () => {
		try {
			setIsLoading(true);
			const existingToken = localStorage.getItem("token");
			if (existingToken && !tokenValidated) {
				const response = await tokenStatus(existingToken);

				const { message } = response;
				if (message) throw new Error("Invalid token");

                const airline = (jwt_decode(existingToken) as TokenData).airline;
                setIsAirline(airline)

				const user = await fetchUserById(response.id);
				setUser(user);
			}

            setTokenValidated(true);
		} catch (error) {
			logout();
		} finally {
			setIsLoading(false);
        }

        return user;
	};

	const logout = () => {
		localStorage.removeItem("token");
		setUser(null);
        setTokenValidated(false)
		navigate("/login");
	};

	return { user, isLoading, authenticate, validateToken, isAirline, logout, error };
};