import { ClientResponseError } from '@atcute/client';

import { isNetworkError } from '#/lib/errors';

import { useLeaveConvo } from '#/state/queries/messages/leave-conversation';

import * as Prompt from '#/components/Prompt';
import * as Toast from '#/components/Toast';

import { m } from '#/paraglide/messages';
import { useRouter } from '#/router';

export function LeaveConvoPrompt({
	handle,
	convoId,
	currentScreen,
	hasMessages = true,
}: {
	handle: Prompt.PromptHandle;
	convoId: string;
	currentScreen: 'list' | 'conversation';
	hasMessages?: boolean;
}) {
	const router = useRouter();

	const { mutate: leaveConvo } = useLeaveConvo(convoId, {
		onMutate: () => {
			if (currentScreen === 'conversation') {
				router.navigate({ replace: true, to: { name: 'Messages' } });
			}
		},
		onError: (error) => {
			let errorMessage = m['components.dms.leave.error.leave']();
			if (isNetworkError(error)) {
				errorMessage = m['common.error.network']();
			} else if (error instanceof ClientResponseError && error.error === 'InvalidConvo') {
				errorMessage = m['common.chat.error.notFound']();
			} else if (error instanceof ClientResponseError && error.error === 'OwnerCannotLeave') {
				errorMessage = m['components.dms.leave.error.ownerMustLock']();
			}
			Toast.show(errorMessage, { type: 'error' });
		},
	});

	return (
		<Prompt.Basic
			handle={handle}
			title={m['components.dms.leave.action.conversation']()}
			description={hasMessages ? m['components.dms.leave.groupPrompt']() : m['components.dms.leave.prompt']()}
			confirmButtonCta={m['common.action.leave']()}
			confirmButtonColor="negative"
			onConfirm={() => leaveConvo()}
		/>
	);
}
