import { ReactNode, Component, CSSProperties } from 'react';
import axios from 'axios';

import { Button, Vierkant, CheckBox, Input } from './ui';
import { DialogBox } from './dialogBox';
import { ruleset, userPreferences } from '../api/api';

import BuildOutlinedIcon from '@material-ui/icons/BuildOutlined';


type CurrentGameSettingsStateType = {
	editGameRulesDialogVisible: boolean;
	ruleset: ruleset;
}

export class CurrentGameSettings extends Component {
	state: CurrentGameSettingsStateType = {
		editGameRulesDialogVisible: false,
		ruleset: {
			timelimit: {
				enabled: false,
				shared: false
			},
			ranked: false
		}
	}

	constructor(props: {}) {
		super(props);

		if (typeof window === "undefined") return; // return if run on server

		axios.request<userPreferences>({
			method: "get",
			url: `/api/user/preferences`,
			headers: {"content-type": "application/json"}
		})
		//FIXME: this assumes the request ruleset has all properties of a ruleset
		.then(request => this.setState({ ruleset: request.data.ruleset || this.state.ruleset }))
		.catch(() => {});
	}

	showEditGameRules = () => this.setState({ editGameRulesDialogVisible: true });
	hideEditGameRules = () => this.setState({ editGameRulesDialogVisible: false });
	setGameRules = (newRules: ruleset) => this.setState({ ruleset: newRules });

	render() {
		var timelimit_str = this.state.ruleset.timelimit.enabled ?
			`${this.state.ruleset.timelimit.minutes}m${this.state.ruleset.timelimit.seconds}s plus ${this.state.ruleset.timelimit.addmove}` :
			"Geen tijdslimiet"
		var ranked_str = this.state.ruleset.ranked ?
			"Gerangschikt" :
			"Niet gerangschikt"
		return <div style={{
			position: "relative",
			height: 80,
			overflow: "visible",
			zIndex: 1
		}}>
			<p style={{
				opacity: .75,
				fontStyle: "italic",
				userSelect: "none",
				position: "absolute",
				top: "50%",
				left: 0,
				transform: "translateY(-50%)"
			}}>
				{timelimit_str}<br/>
				{ranked_str}
			</p>
			<Button style={{
				width: 150,
				position: "absolute",
				top: "50%",
				right: 0,
				transform: "translateY(-50%)"
			}} onclick={this.showEditGameRules}>
				<BuildOutlinedIcon style={{ fontSize: 48 }}/>
				<span style={{
					fontWeight: 600,
					position: "absolute",
					right: 24,
					top: "50%",
					width: 85,
					verticalAlign: "middle",
					textAlign: "center",
					transform: "translateY(-50%)",
					userSelect: "none"
				}}>Spelregels aanpassen</span>
			</Button>
			<EditGameSettings parentState={this.state} hideEditGameRules={this.hideEditGameRules} setGameRules={this.setGameRules}/>
		</div>;
	}
}

function GameSettingsSection(props: {
	children?: ReactNode;
	title: string;
	state: boolean;
	noMarginBottom?: boolean;
	id: string;
}) {
	return <Vierkant id={props.id} style={{
		backgroundColor: "var(--background-alt)",
		width: "100%",
		padding: 16,
		margin: 0,
		marginBottom: props.noMarginBottom ? 0 : 24
	}}>
	<span style={{
		verticalAlign: "top",
		fontSize: 14,
		fontWeight: 600
	}}>{props.title}</span>
	<CheckBox state={props.state} id={`${props.id}_enabled`} style={{
		verticalAlign: "top",
		float: "right",
		margin: -3
	}}/>
	<div>{props.children}</div>
	</Vierkant>
}

function GameRule(props: {
	title: string;
	description: string;
	style?: CSSProperties;
}) {
	return <div style={{
		backgroundColor: "var(--page-background)",
		borderRadius: 8,
		padding: "16px 0",
		textAlign: "center",
		...props.style
	}}>
		<h1 style={{ color: "var(--disk-a)", fontSize: 42 }}>{props.title}</h1>
		<p style={{ color: "var(--text-alt)", maxWidth: 250, margin: "0 auto" }}>{props.description}</p>
	</div>;
}

type editGameSettingsProps = {
	parentState: CurrentGameSettingsStateType;
	hideEditGameRules: () => void;
	setGameRules: (newRules: ruleset) => void;
};

export class EditGameSettings extends Component<editGameSettingsProps> {
	render () {
		return <DialogBox title="Spelregels aanpassen" style={{
			margin: 0,
			display: this.props.parentState.editGameRulesDialogVisible ? "block" : "none"
		}} onclick={this.props.hideEditGameRules}>
			<div style={{
				marginTop: 24,
				maxHeight: 500,
				overflowY: "scroll",
				borderRadius: 8,
			}}>
				<GameSettingsSection title="Tijdslimiet" state={this.props.parentState.ruleset.timelimit.enabled} id="timelimit">
					<div style={{
						display: "grid",
						gridTemplateColumns: "1fr 1fr 1fr",
						gridGap: 16,
						margin: "16px 0"
					}}>
						<Input id="timelimit_minutes" type="number" label="min" min={0} max={60} value={this.props.parentState.ruleset.timelimit.minutes}/>
						<Input id="timelimit_seconds" type="number" label="sec" min={0} max={60} value={this.props.parentState.ruleset.timelimit.seconds}/>
						<Input id="timelimit_addmove" type="number" label="plus" min={0} value={this.props.parentState.ruleset.timelimit.addmove}/>
					</div>
					<CheckBox id="timelimit_shared" state={this.props.parentState.ruleset.timelimit.shared}/>
					<span style={{
						verticalAlign: "super",
						marginLeft: 4
					}}>Timer gebruiken voor bijde spelers</span>
				</GameSettingsSection>
				{ false && <GameSettingsSection title="Regelset" state={false}>
					<div style={{
						display: "grid",
						gridTemplateColumns: "1fr 1fr",
						gridGap: 16,
						margin: "16px 0"
					}}>
						<GameRule title="+2" description="Extra kolommen"/>
						<GameRule title="+4" description="Extra kolommen"/>
					</div>
					<GameRule style={{ marginBottom: 16 }} title="Gravity" description="De zwaartekracht draait soms"/>
					<GameRule title="Flashlight" description="Het veld wordt opgelicht door de vallende fiches"/>
				</GameSettingsSection> }
				<GameSettingsSection title="Gerangschikt spel" state={this.props.parentState.ruleset.ranked} id="ranked" noMarginBottom/>
			</div>
			<Button style={{
				textAlign: "center",
				marginTop: 24
			}} onclick={() => {
				var rules: ruleset = {
					timelimit: {
						enabled: document.getElementById("timelimit_enabled").classList.contains("on"),
						minutes: Number((document.getElementById("timelimit_minutes") as HTMLInputElement).value),
						seconds: Number((document.getElementById("timelimit_seconds") as HTMLInputElement).value),
						addmove: Number((document.getElementById("timelimit_addmove") as HTMLInputElement).value),
						shared: document.getElementById("timelimit_shared").classList.contains("on"),
					},
					ranked: document.getElementById("ranked_enabled").classList.contains("on")
				}
				this.props.setGameRules(rules);
				this.props.hideEditGameRules();
			}}>Instellingen opslaan</Button>
		</DialogBox>;
	}
}