"use client";
import { ChatBubbleIcon, PaperPlaneIcon } from "@radix-ui/react-icons";
import { useLeftMenuStore } from "_store/leftMenuStore";
import { useSession } from "next-auth/react";
import { Fragment, useEffect, useState } from "react";
import { cn } from "_helpers/cn";
import { asPublicUser } from "@repo/db";
import { useQuery } from "@tanstack/react-query";
import { getConnectedDispatcherAPI } from "_querys/dispatcher";
import { getConnectedAircraftsAPI } from "_querys/aircrafts";

export const Chat = () => {
	const {
		setReportTabOpen,
		chatOpen,
		setChatOpen,
		sendMessage,
		addChat,
		chats,
		setOwnId,
		selectedChat,
		setSelectedChat,
		setChatNotification,
	} = useLeftMenuStore();
	const [sending, setSending] = useState(false);
	const session = useSession();
	const [addTabValue, setAddTabValue] = useState<string>("default");
	const [message, setMessage] = useState<string>("");

	const { data: dispatcher } = useQuery({
		queryKey: ["dispatcher"],
		queryFn: () => getConnectedDispatcherAPI(),
		refetchInterval: 10000,
	});
	const { data: aircrafts } = useQuery({
		queryKey: ["aircrafts"],
		queryFn: () => getConnectedAircraftsAPI(),
		refetchInterval: 10000,
	});

	const filteredDispatcher = dispatcher?.filter((d) => d.userId !== session.data?.user.id);
	const filteredAircrafts = aircrafts?.filter((a) => a.userId !== session.data?.user.id);

	return (
		<div className={cn("dropdown dropdown-right", chatOpen && "dropdown-open")}>
			<div className="indicator">
				{Object.values(chats).some((c) => c.notification) && (
					<span className="indicator-item status status-info"></span>
				)}
				<button
					className="btn btn-soft btn-sm btn-primary"
					onClick={() => {
						setReportTabOpen(false);
						setChatOpen(!chatOpen);
						if (selectedChat) {
							setChatNotification(selectedChat, false);
						}
					}}
				>
					<ChatBubbleIcon className="w-4 h-4" />
				</button>
			</div>
			{chatOpen && (
				<div
					tabIndex={0}
					className="dropdown-content card bg-base-200 w-150 shadow-md z-[1100] ml-2 border-1 border-primary"
				>
					<div className="card-body">
						<h2 className="inline-flex items-center gap-2 text-lg font-bold mb-2">
							<ChatBubbleIcon /> Chat
						</h2>
						<div className="join">
							<select
								className="select select-sm w-full"
								value={addTabValue}
								onChange={(e) => setAddTabValue(e.target.value)}
							>
								{!filteredDispatcher?.length && !filteredAircrafts?.length && (
									<option disabled value="default">
										Keine Chatpartner gefunden
									</option>
								)}
								{filteredDispatcher?.length ||
									(filteredAircrafts?.length && (
										<option disabled value="default">
											Chatpartner auswählen
										</option>
									))}

								{filteredDispatcher?.map((dispatcher) => (
									<option key={dispatcher.userId} value={dispatcher.userId}>
										{dispatcher.zone} - {asPublicUser(dispatcher.publicUser).fullName}
									</option>
								))}
								{filteredAircrafts?.map((aircraft) => (
									<option key={aircraft.userId} value={aircraft.userId}>
										{aircraft.Station.bosCallsignShort} -{" "}
										{asPublicUser(aircraft.publicUser).fullName}
									</option>
								))}
							</select>
							<button
								className="btn btn-sm btn-soft btn-primary join-item"
								onClick={() => {
									const aircraftUser = aircrafts?.find((a) => a.userId === addTabValue);
									const dispatcherUser = dispatcher?.find((d) => d.userId === addTabValue);
									const user = aircraftUser || dispatcherUser;
									if (!user) return;
									addChat(addTabValue, asPublicUser(user.publicUser).fullName);
									setSelectedChat(addTabValue);
								}}
							>
								<span className="text-xl">+</span>
							</button>
						</div>
						<div className="tabs tabs-lift">
							{Object.keys(chats).map((userId) => {
								const chat = chats[userId];
								if (!chat) return null;
								return (
									<Fragment key={userId}>
										<input
											type="radio"
											name="my_tabs_3"
											className="tab"
											aria-label={`<${chat.name}>`}
											checked={selectedChat === userId}
											onClick={() => {
												setChatNotification(userId, false);
											}}
											onChange={(e) => {
												if (e.target.checked) {
													// Handle tab change
													setSelectedChat(userId);
												}
											}}
										/>
										<div className="tab-content bg-base-100 border-base-300 p-6">
											{chat.messages.map((chatMessage) => {
												const isSender = chatMessage.senderId === session.data?.user.id;
												return (
													<div
														key={chatMessage.id}
														className={`chat ${isSender ? "chat-end" : "chat-start"}`}
													>
														<p className="chat-footer opacity-50">
															{new Date(chatMessage.timestamp).toLocaleTimeString()}
														</p>
														<div className="chat-bubble">{chatMessage.text}</div>
													</div>
												);
											})}
											{!chat.messages.length && (
												<p className="text-xs opacity-50">Noch keine Nachrichten</p>
											)}
										</div>
									</Fragment>
								);
							})}
						</div>
						<div className="join">
							<div className="w-full">
								<label className="input join-item w-full">
									<input
										type="text"
										required
										className="w-full"
										onChange={(e) => {
											setMessage(e.target.value);
										}}
										value={message}
									/>
								</label>
							</div>
							<button
								className="btn btn-soft join-item"
								onClick={(e) => {
									e.preventDefault();
									if (message.length < 1) return;
									if (!selectedChat) return;
									setSending(true);
									sendMessage(selectedChat, message)
										.then(() => {
											setMessage("");
											setSending(false);
										})
										.catch(() => {
											setSending(false);
										});
									return false;
								}}
								disabled={sending}
								role="button"
								onSubmit={() => false} // prevent submit event for react hook form
							>
								{sending ? (
									<span className="loading loading-spinner loading-sm"></span>
								) : (
									<PaperPlaneIcon />
								)}
							</button>
						</div>
					</div>
				</div>
			)}
		</div>
	);
};
