import { CSSProperties, ReactNode, useState, useContext, useEffect } from 'react';
import axios from 'axios';

import { userInfo, gameInfo } from "../api/api";
import { AccountAvatar } from "./account";
import { Bubble, Vierkant, IconLabelButton } from './ui';
import { ToastContext } from './toast';

import DoneIcon from '@material-ui/icons/Done';
import CloseIcon from '@material-ui/icons/Close';
import NotificationsActiveOutlinedIcon from '@material-ui/icons/NotificationsActiveOutlined';

export function NotificationsArea(props: {
	visible?: boolean;
	friendRequests?: Array<userInfo>;
	gameInvites?: Array<gameInfo>;
	rerender: () => void;
}) {
	var { toast } = useContext(ToastContext);
	var [ previousMessages, setPreviousMessages ] = useState(0);
	var messages = (
		(props.friendRequests ? props.friendRequests.length : 0) +
		(props.gameInvites ? props.gameInvites.length : 0)
	)

	useEffect(() => {
		if(messages > previousMessages) {
			toast({ message: "Je hebt nieuwe meldingen!",
				type: "confirmation",
				icon: <NotificationsActiveOutlinedIcon/>});
		}

		setPreviousMessages(messages);
	})

	return props.visible && <Bubble style={{
		left: 48 + 12,
		top: 92,
		transform: "translateY(-100%)",
		textAlign: "left",
		width: 400,
		height: 450
	}} tuitjeStyle={{
		left: 12,
		bottom: 86,
		transform: "translate(-100%, 100%) rotate(90deg)"
	}}>
		<h2 style={{ marginBottom: 24 }}>Meldingen</h2>
		<div style={{
			overflowY: "scroll",
			whiteSpace: "normal",
			height: 450 - 24 * 4,
			borderRadius: 6
		}}>
			{ props.gameInvites?.map(game => <GameInvite hide={props.rerender} game={game}/>) }
			{ props.friendRequests?.map(user => <FriendRequest hide={props.rerender} user={user}/>) }
			{
				messages == 0 &&
				<div style={{
					position: "absolute",
					left: 0,
					right: 0,
					bottom: 0,
					top: 0
				}}>
					<h1 style={{
						position: "absolute",
						top: "50%",
						left: "50%",
						whiteSpace: "nowrap",
						transform: "translate(-50%, -50%)",
						opacity: .7
					}}>Geen meldingen</h1>
				</div>
			}
		</div>
	</Bubble>
}

var FriendRequestButtonStyle: CSSProperties = {
	borderRadius: 6,
	display: "inline-block",
	marginLeft: 0,
	textAlign: "center"
};

function Acceptable(props: {
	children?: ReactNode;
	onAccept?: () => void;
	onDeny?: () => void;
}) {
	return <Vierkant style={{
		borderRadius: 8,
		background: "var(--background-alt)",
		margin: 0,
		padding: 12,
		width: "100%",
		marginBottom: 12
	}}>
		<div style={{ position: "relative" }}>
			{props.children}
			<div style={{
				display: "grid",
				gridTemplateColumns: "1fr, 1fr",
				gridGap: 12,
				marginTop: 12,
				gridAutoFlow: "column",
			}}>
				<IconLabelButton
					onclick={props.onAccept}
					style={FriendRequestButtonStyle}
					icon={<DoneIcon/>}
					text="Accepteren"/>
				<IconLabelButton
					onclick={props.onDeny}
					style={FriendRequestButtonStyle}
					icon={<CloseIcon/>}
					text="Verwijderen"/>
			</div>
		</div>
	</Vierkant>
}

function FriendRequest(props: {
	user: userInfo;
	hide: () => void;
}) {
	var [ gone, setGone ] = useState(false);

	var hide = () => {
		setGone(true);
		props.hide();
	}

	return !gone && <Acceptable onAccept={() => {
		axios.request({
			method: "post",
			url: "/api/social/accept",
			headers: {"content-type": "application/json"},
			data: { "id": props.user?.id }
		})
		.then(hide);
	}} onDeny={() => {
		axios.request({
			method: "post",
			url: "/api/social/remove",
			headers: {"content-type": "application/json"},
			data: { "id": props.user?.id }
		})
		.then(hide);
	}}>
		<a href={"/user?id=" + props.user.id}>
			<AccountAvatar size={48} id={props.user.id}/>
			<div style={{
				display: "inline-block",
				verticalAlign: "top",
				marginLeft: 6
			}}>
				<i style={{ display: "block" }}>Vriendschapsverzoek</i>
				<b>{props.user.username}</b>
			</div>
		</a>
	</Acceptable>
}

function GameInvite(props: {
	game: gameInfo;
	hide: () => void;
}) {
	return <Acceptable>
		<a>
			<div style={{
				display: "inline-block",
				verticalAlign: "top",
			}}>
				<i style={{ display: "block" }}>Partijuitnodiging</i>
				<p><b><a href={"/user?id=" + props.game.opponent?.id}>{props.game.opponent?.username}</a></b> wil een potje 4 op een rij spelen!</p>
			</div>
		</a>
	</Acceptable>
}

