import MainControl from "@/Common/MainControl/MainControl";
import BusinessTypeSetting, { BusinessEnum } from "@/_BusinessTypeSetting/BusinessTypeSetting";
import { PlayerData } from "@/define/playerData";
import { IGameItems } from "@/types";
import { ReactNode, createContext, useContext, useState } from "react";

type GameItemsProviderProps = {
	children: ReactNode;
};
const GameItemsContext = createContext<IGameItems>(undefined);

export function useGameItems() {
	return useContext(GameItemsContext);
}
export let gameObj: IGameItems = null;

export function GameItemsProvider({ children }: GameItemsProviderProps) {
	const [gameId, setGameId] = useState<number>(null);
	const [player, setPlayer] = useState<PlayerData>({
		token: "",
	});

	const game: IGameItems = gameObj = {
		onLoad,
		gameId,
		setGameId,
		player,
		setPlayer
	};

	async function onLoad(serverType: BusinessEnum.ServerType) {
		new MainControl();
		await Promise.all([
			// 設定執行環境
			setBusinessType(serverType),

			// // 設定LineTools環境
			// await setLineTools(),
		]);
	}

	/** 設定執行環境 */
	function setBusinessType(useServerType: BusinessEnum.ServerType): void {
		// 連線參數自定義
		const queryParameters = new URLSearchParams(location.search);
		const servertype: string = queryParameters.get("servertype") ?? useServerType.toString();
		const host: string = queryParameters.get("host");
		const port: string = queryParameters.get("port");
		const patch: string = queryParameters.get("patch");
		const downloadurl: string = queryParameters.get("downloadurl");
		const liffid: string = queryParameters.get("liffid");
		if (servertype) {
			// 自定預設環境
			BusinessTypeSetting.UseServerType = +servertype;
			BusinessTypeSetting.UseHost = BusinessTypeSetting.GetHostUrl(BusinessTypeSetting.UseServerType);
			BusinessTypeSetting.UsePort = BusinessTypeSetting.GetPortNum(BusinessTypeSetting.UseServerType);
			BusinessTypeSetting.UsePatch = BusinessTypeSetting.GetPatchUrl(BusinessTypeSetting.UseServerType);
			BusinessTypeSetting.UseDownloadUrl = BusinessTypeSetting.GetDownloadUrl(BusinessTypeSetting.UseServerType);
			BusinessTypeSetting.UseLiffID = BusinessTypeSetting.GetLiffID(BusinessTypeSetting.UseServerType);
			BusinessTypeSetting.UseLineID = BusinessTypeSetting.GetLineID(BusinessTypeSetting.UseServerType);
		}
		if (host) {
			// 自定連線1(有自定則無視UseServerType)
			BusinessTypeSetting.UseHost = host;
		}
		if (port) {
			// 自定連線2(有自定則無視UseServerType)
			BusinessTypeSetting.UsePort = +port;
		}
		if (patch) {
			// 自定連資源伺服器(有自定則無視UseServerType)
			BusinessTypeSetting.UsePatch = patch;
		}
		if (downloadurl) {
			// 自定連靜態伺服器(有自定則無視UseServerType)
			BusinessTypeSetting.UseDownloadUrl = downloadurl;
		}
		if (liffid) {
			// 自定連Line Liff(有自定則無視UseServerType)
			BusinessTypeSetting.UseLiffID = liffid;
		}
		return;
	}

	return (
		<GameItemsContext.Provider value={game}>
			{children}
		</GameItemsContext.Provider>
	);
}
