import type { ComponentType, SVGProps } from 'react';

import type { ChatBskyActorDefs, ChatBskyConvoDefs } from '@atcute/bluesky';

import LeaveIcon from '#/icons/central/ArrowBoxLeft_round_outlined_radius1_stroke2.svg';
import JoinIcon from '#/icons/central/ArrowBoxRight_round_outlined_radius1_stroke2.svg';
import ChainLinkBrokenIcon from '#/icons/central/BrokenChainLink3_round_outlined_radius1_stroke2.svg';
import ChainLinkIcon from '#/icons/central/ChainLink3_round_outlined_radius1_stroke2.svg';
import LockIcon from '#/icons/central/Lock_round_outlined_radius1_stroke2.svg';
import PencilIcon from '#/icons/central/PencilLine_round_outlined_radius1_stroke2.svg';
import UnlockIcon from '#/icons/central/Unlocked_round_outlined_radius1_stroke2.svg';
import { m } from '#/paraglide/messages';

export type SystemMessageAction =
	| {
			kind: 'profile';
			profile: ChatBskyActorDefs.ProfileViewBasic;
			handle: string;
	  }
	| { kind: 'inviteLink' };

export type SystemMessageInfo = {
	message: string;
	Icon: ComponentType<SVGProps<SVGSVGElement>>;
	action?: SystemMessageAction;
};

function getProfileAction(
	user: ChatBskyConvoDefs.SystemMessageReferredUser,
	relatedProfiles: Map<string, ChatBskyActorDefs.ProfileViewBasic>,
): Extract<SystemMessageAction, { kind: 'profile' }> | null {
	const profile = relatedProfiles.get(user.did);
	if (!profile) {
		return null;
	}
	return {
		kind: 'profile',
		profile,
		handle: profile.handle,
	};
}

export function getSystemMessageInfo(
	data: ChatBskyConvoDefs.SystemMessageView['data'],
	relatedProfiles: Map<string, ChatBskyActorDefs.ProfileViewBasic>,
	opts = { short: false },
): SystemMessageInfo | null {
	switch (data.$type) {
		case 'chat.bsky.convo.defs#systemMessageDataAddMember': {
			const action = getProfileAction(data.member, relatedProfiles);
			return {
				Icon: JoinIcon,
				message: action
					? opts.short
						? m['components.dms.update.added']({ name: action.handle })
						: m['components.dms.update.addedToGroup']({ name: action.handle })
					: opts.short
						? m['components.dms.update.someoneAdded']()
						: m['components.dms.update.someoneAddedToGroup'](),
				action: action ?? undefined,
			};
		}
		case 'chat.bsky.convo.defs#systemMessageDataRemoveMember': {
			const action = getProfileAction(data.member, relatedProfiles);
			return {
				Icon: LeaveIcon,
				message: action
					? opts.short
						? m['components.dms.update.removed']({ name: action.handle })
						: m['components.dms.update.removedFromGroup']({ name: action.handle })
					: opts.short
						? m['components.dms.update.someoneRemoved']()
						: m['components.dms.update.someoneRemovedFromGroup'](),
				action: action ?? undefined,
			};
		}
		case 'chat.bsky.convo.defs#systemMessageDataMemberJoin': {
			const action = getProfileAction(data.member, relatedProfiles);
			return {
				Icon: JoinIcon,
				message: action
					? opts.short
						? m['components.dms.update.joined']({ name: action.handle })
						: m['components.dms.update.joinedGroup']({ name: action.handle })
					: opts.short
						? m['components.dms.update.someoneJoined']()
						: m['components.dms.update.someoneJoinedGroup'](),
				action: action ?? undefined,
			};
		}
		case 'chat.bsky.convo.defs#systemMessageDataMemberLeave': {
			const action = getProfileAction(data.member, relatedProfiles);
			return {
				Icon: LeaveIcon,
				message: action
					? opts.short
						? m['components.dms.update.left']({ name: action.handle })
						: m['components.dms.update.leftGroup']({ name: action.handle })
					: opts.short
						? m['components.dms.update.someoneLeft']()
						: m['components.dms.update.someoneLeftGroup'](),
				action: action ?? undefined,
			};
		}
		case 'chat.bsky.convo.defs#systemMessageDataLockConvo': {
			return { Icon: LockIcon, message: m['components.dms.update.chatLocked']() };
		}
		case 'chat.bsky.convo.defs#systemMessageDataUnlockConvo': {
			return { Icon: UnlockIcon, message: m['components.dms.update.chatUnlocked']() };
		}
		case 'chat.bsky.convo.defs#systemMessageDataLockConvoPermanently': {
			return { Icon: LockIcon, message: m['components.dms.update.chatEnded']() };
		}
		case 'chat.bsky.convo.defs#systemMessageDataEditGroup': {
			return {
				Icon: PencilIcon,
				message:
					data.newName && !opts.short
						? m['components.dms.update.titleChangedTo']({ name: data.newName })
						: m['components.dms.update.titleChanged'](),
			};
		}
		case 'chat.bsky.convo.defs#systemMessageDataCreateJoinLink': {
			return {
				Icon: ChainLinkIcon,
				message: m['components.dms.invite.created'](),
				action: { kind: 'inviteLink' },
			};
		}
		case 'chat.bsky.convo.defs#systemMessageDataEditJoinLink': {
			return {
				Icon: ChainLinkIcon,
				message: m['components.dms.invite.edited'](),
				action: { kind: 'inviteLink' },
			};
		}
		case 'chat.bsky.convo.defs#systemMessageDataEnableJoinLink': {
			return {
				Icon: ChainLinkIcon,
				message: m['components.dms.invite.enabled'](),
				action: { kind: 'inviteLink' },
			};
		}
		case 'chat.bsky.convo.defs#systemMessageDataDisableJoinLink': {
			return {
				Icon: ChainLinkBrokenIcon,
				message: m['common.chat.inviteLinkDisabled'](),
				action: { kind: 'inviteLink' },
			};
		}
	}
	return null;
}
