import React, { useContext, useEffect, useState } from 'react';

const AUTH_URL = 'https://dev-auth.fiskerdps.com';
const UserContext = React.createContext();

export const UserProvider = ({ children }) => {
	const [fetching, setFetching] = useState(false);
	const [signedIn, setSignedIn] = useState(false);
	const [user, setUser] = useState(null);
	const [token, setToken] = useState(null);
	const [error, setError] = useState(null);

	const signIn = (username, password) => {
		if (!username) throw new Error('Email is required');
		if (!password) throw new Error('Password is required');
		setFetching(true);
		setError(null);
		return fetch(`${AUTH_URL}/auth/login`, {
				method: "POST",
				mode: "no-cors",
				headers: {
					"Content-Type":"text/plain"
				},
				body: JSON.stringify({
					username,
					password,
				})
			})
			.then((response) => {
				debugger;
				return response.json();
			})
			.then((result) => {
				debugger;
				setFetching(false);
				if (result.error) setError(result.error);
				return result;
			})
			.catch((error) => {
				setError(error.message);
				setFetching(false);
				return null;
			});
		};

	const signUp = (username, password, confirmPassword) => {
		if (!username) throw new Error('Email is required');
		if (!password) throw new Error('Password is required');
		if (password !== confirmPassword) throw new Error('Passwords do not match');
		setFetching(true);
		setError(null);
		return fetch(`${AUTH_URL}/auth/register`, {
				method: "POST",
				mode: "cors",
				headers: {
					"Content-Type": "application/json"
				},
				body: JSON.stringify({
					username,
					password,
				})
			})
				.then((response) => {
					debugger;
					return response.json();
				})
				.then((result) => {
					if (result.error) setError(result.error);
					setFetching(false);
					return result;
				})
				.catch((error) => {
					setError(error.message);
					setFetching(false);
					return null;
				});
			};

	const signOut = async () => {
		setUser(null);
	};

	return (
		<UserContext.Provider value={{
			fetching,
			signedIn,
			user,
			token,
			error,
			setError,
			signIn,
			signUp,
			signOut,
		}}>
			{children}
		</UserContext.Provider>
	);
};

export const useUserContext = () => useContext(UserContext);
