import React, { useContext } from 'react';
import { Text, TouchableOpacity, View } from 'react-native';

import { themes } from '../../../lib/constants';
import { IEmoji } from '../../../definitions/IEmoji';
import { useTheme } from '../../../theme';
import Avatar from '../../Avatar';
import { MENTIONS_TRACKING_TYPE_CANNED, MENTIONS_TRACKING_TYPE_COMMANDS, MENTIONS_TRACKING_TYPE_EMOJIS } from '../constants';
import MessageboxContext from '../Context';
import styles from '../styles';
import FixedMentionItem from './FixedMentionItem';
import MentionEmoji from './MentionEmoji';

interface IMessageBoxMentionItem {
	item: {
		name: string;
		command: string;
		username: string;
		t: string;
		id: string;
		shortcut: string;
		text: string;
	} & IEmoji;
	trackingType: string;
}

const MentionItemContent = React.memo(({ trackingType, item }: IMessageBoxMentionItem) => {
	const { theme } = useTheme();
	switch (trackingType) {
		case MENTIONS_TRACKING_TYPE_EMOJIS:
			return (
				<>
					<MentionEmoji item={item} />
					<Text style={[styles.mentionText, { color: themes[theme].titleText }]}>:{item.name ?? item}:</Text>
				</>
			);
		case MENTIONS_TRACKING_TYPE_COMMANDS:
			return (
				<>
					<View style={[styles.slash, { backgroundColor: themes[theme].borderColor }]}>
						<Text style={{ color: themes[theme].tintColor }}>/</Text>
					</View>
					<Text style={[styles.mentionText, { color: themes[theme].titleText }]}>{item.id}</Text>
				</>
			);
		case MENTIONS_TRACKING_TYPE_CANNED:
			return (
				<>
					<Text style={[styles.cannedItem, { color: themes[theme].titleText }]}>!{item.shortcut}</Text>
					<Text numberOfLines={1} style={[styles.cannedMentionText, { color: themes[theme].auxiliaryTintColor }]}>
						{item.text}
					</Text>
				</>
			);

		default:
			return (
				<>
					<Avatar style={styles.avatar} text={item.username || item.name} size={30} type={item.t} />
					<Text style={[styles.mentionText, { color: themes[theme].titleText }]}>{item.username ?? item.name ?? item}</Text>
				</>
			);
	}
});

const MentionItem = ({ item, trackingType }: IMessageBoxMentionItem) => {
	const context = useContext(MessageboxContext);
	const { theme } = useTheme();
	const { onPressMention } = context;

	const defineTestID = (type: string) => {
		switch (type) {
			case MENTIONS_TRACKING_TYPE_EMOJIS:
				return `mention-item-${item.name || item}`;
			case MENTIONS_TRACKING_TYPE_COMMANDS:
				return `mention-item-${item.command || item}`;
			case MENTIONS_TRACKING_TYPE_CANNED:
				return `mention-item-${item.shortcut || item}`;
			default:
				return `mention-item-${item.username || item.name || item}`;
		}
	};

	const testID = defineTestID(trackingType);

	if (item.username === 'all' || item.username === 'here') {
		return <FixedMentionItem item={item} onPress={onPressMention} />;
	}

	return (
		<TouchableOpacity
			style={[
				styles.mentionItem,
				{
					backgroundColor: themes[theme].auxiliaryBackground,
					borderTopColor: themes[theme].separatorColor
				}
			]}
			onPress={() => onPressMention(item)}
			testID={testID}
		>
			<MentionItemContent item={item} trackingType={trackingType} />
		</TouchableOpacity>
	);
};

export default MentionItem;
