import CSMessage from "@/Common/Message/CSMessage";
import { CoroutineV2 } from "@/Engine/CatanEngine/CoroutineV2/CoroutineV2";
import { INetResponse } from "@/Engine/CatanEngine/NetManagerV2/Core/INetResponse";
import CSSettingsSDV3 from "@/FormTableSD/CSSettingsSDV3";
import BusinessTypeSetting, { BusinessEnum } from "@/_BusinessTypeSetting/BusinessTypeSetting";
import Image from "@/components/Image/Image";
import { useGameItems } from "@/context/GameItemsContext";
import { GameLaunchRequest, GameLeaveRequest, RpcGameLaunchResponse } from "@/define/Request/GameRequest";
import { SlotData } from "@/define/gameData";
import { Button, Flex } from "antd";
import { useEffect, useState } from "react";
import SDGame from "./SDGame";

const SlotList = () => {
	const { gameData, setGameData } = useGameItems();
	const { slotData, slotList, nowSlotId } = gameData;
	const [isGameIn, setIsGameIn] = useState<boolean>(false);
	const [gameUrl, setGameUrl] = useState<string>("");

	function onLoad() {

	}

	function* onClickSlotIn(slotId: number): IterableIterator<any> {
		const data: SlotData = slotData[slotId];
		const [componyID] = data;
		const req: GameLaunchRequest = new GameLaunchRequest(componyID, slotId);
		yield req.SendAsync();
		const resp: INetResponse<RpcGameLaunchResponse> = req.Result;
		if (!resp.IsValid) {
			if (resp.Status === 18) {
				CSMessage.CreateYesMsg(CSSettingsSDV3.prototype.CommonString(16));
			}
			return;
		}
		setIsGameIn(true);
		const url: string = resp.Data;
		setGameData({
			...gameData,
			nowSlotId: slotId
		});
		const UseServerType = BusinessTypeSetting.UseServerType;
		const ServerType = BusinessEnum.ServerType[UseServerType];
		const SDType = BusinessEnum.ComponyType[ServerType];
		if (componyID === SDType) {
			setGameUrl(url);
		}
		else {
			window.open(url, "_blank");
		}
	}

	function onClickSlotOut() {
		const gameLeaveReq: GameLeaveRequest = new GameLeaveRequest(nowSlotId);
		gameLeaveReq.Send();
		setGameUrl("");
		setIsGameIn(false);
	}

	useEffect(() => {
		onLoad();
	}, []);

	return (<>
		{isGameIn
			? <>{gameUrl
				? <SDGame gameUrl={gameUrl} onClickSlotOut={onClickSlotOut} />
				: <Flex gap="small" wrap="wrap">
					<Button type="primary" onClick={onClickSlotOut}>離開機台</Button>
				</Flex>}</>

			: <div style={contentStyle}>
				<Flex gap="small" wrap="wrap" style={{ overflowY: "scroll" }}>
					{slotList.map((slotId: number, index: number) =>
						<Image key={index} width={80} height={80} src={`${BusinessTypeSetting.UseDownloadUrl}game/${slotId}/s`}
							onClick={() => { CoroutineV2.Single(onClickSlotIn(slotId)).Start(); }} style={{ cursor: "pointer" }} />
					)}
				</Flex>
			</div>
		}
	</>);
};

export default SlotList;

const contentStyle: React.CSSProperties = {
	fontSize: "1rem",
	minHeight: 120,
	lineHeight: "120px",
	color: "#000000",
	display: "flex",
	textAlign: "center",
	flexDirection: "column",
	justifyContent: "center",
	width: "100%"
};