import React, { FC, useEffect, useState } from 'react';
import { View, StyleSheet } from 'react-native';
import { NavigationProp } from '@react-navigation/native';
import { PageWrapper, Header, Input, WarningModal } from 'src/components';
import { FlashList } from '@shopify/flash-list';

import SearchIcon from 'assets/icons/search.svg';
import { applyModalSort, dataRanking } from '../../TravellersScreen/utils';
import { RankingDropdown } from '../../TravellersScreen/utils/types';
import { Profile } from '../../MapScreen/UsersListScreen/Profile';
import { FilterButton, FilterModal } from '../../TravellersScreen/Components/FilterModal';
import { usePostGetCountriesRanking } from '@api/ranking';
import OptionsModal from '../Components/OptionsModal';
import { SheetManager } from 'react-native-actions-sheet';
import { storage, StoreType } from 'src/storage';

type Props = {
  navigation: NavigationProp<any>;
  route: any;
};

const ParticipantsListScreen: FC<Props> = ({ navigation, route }) => {
  const { participants, eventId, isHost } = route.params;
  const token = storage.get('token', StoreType.STRING);
  const { data: masterCountries } = usePostGetCountriesRanking();

  const [allParticipants, setAllParticipants] = useState(participants);
  const [searchQuery, setSearchQuery] = useState('');
  const [filteredData, setFilteredData] = useState<any[]>([]);
  const [confirmedValueRanking, setConfirmedValueRanking] = useState<RankingDropdown | null>();
  const [isModalVisible, setModalVisible] = useState(false);
  const [modalState, setModalState] = useState({
    isWarningVisible: false,
    title: '',
    buttonTitle: '',
    message: '',
    action: () => {}
  });

  useEffect(() => {
    if (allParticipants) {
      setFilteredData(allParticipants);
    }
  }, [allParticipants]);

  const handleSearch = (text: string) => {
    if (text && allParticipants) {
      const searchData =
        allParticipants?.filter((item: any) => {
          const itemData = item.first_name
            ? item.first_name.toLowerCase() + ' ' + item.last_name?.toLowerCase()
            : ''.toLowerCase();
          const textData = text.toLowerCase();
          return itemData.indexOf(textData) > -1;
        }) ?? [];
      setFilteredData(searchData);
      setSearchQuery(text);
    } else {
      setFilteredData(allParticipants ?? []);
      setSearchQuery(text);
    }
  };

  const handleFilterParticipants = (userId: number) => {
    setAllParticipants(allParticipants.filter((p: any) => p.user_id !== userId));
  };

  const handleOptionPress = (user: any) => {
    SheetManager.show('host-options-modal', {
      payload: {
        eventId,
        userId: user.user_id,
        name: user.first_name + ' ' + user.last_name,
        token,
        filterParticipants: () => handleFilterParticipants(user.user_id),
        setIsWarningVisible: setModalState
      } as any
    });
  };

  return (
    <PageWrapper>
      <Header
        label="Participants"
        rightElement={<FilterButton onPress={() => setModalVisible(!isModalVisible)} />}
      />
      <View style={styles.container}>
        <Input
          inputMode={'search'}
          placeholder={'Search nomads'}
          onChange={handleSearch}
          value={searchQuery}
          icon={<SearchIcon fill={'#C8C8C8'} width={14} height={14} />}
        />
        <FlashList
          viewabilityConfig={{
            waitForInteraction: true,
            itemVisiblePercentThreshold: 50,
            minimumViewTime: 1000
          }}
          estimatedItemSize={50}
          data={filteredData || []}
          renderItem={({ item, index }) => (
            <Profile
              withMenu={isHost}
              onPressOption={() => handleOptionPress(item)}
              userId={item.user_id}
              key={index}
              index={index}
              first_name={item.first_name}
              last_name={item.last_name}
              avatar={item.avatar ? '/img/avatars/' + item.avatar : null}
              date_of_birth={item.age}
              homebase_flag={'/img/flags_new/' + item.flag1}
              homebase2_flag={item.flag2 ? '/img/flags_new/' + item.flag2 : null}
              score={[
                item.score_nm,
                item.score_un,
                item.score_unp,
                item.score_dare,
                item.score_tcc,
                item.score_deep,
                item.score_slow,
                item.score_yes,
                item.score_kye,
                item.score_whs,
                item.score_tbt
              ]}
              active_score={
                confirmedValueRanking ? confirmedValueRanking.value - 1 : dataRanking[0].value - 1
              }
              tbt_score={item.score_tbt}
              tbt_rank={item.rank_tbt}
              badge_tbt={item.badge_tbt}
              badge_1281={item.badge_1281}
              badge_un={item.badge_un}
              badge_un_25={item.badge_un_25}
              badge_un_50={item.badge_un_50}
              badge_un_75={item.badge_un_75}
              badge_un_100={item.badge_un_100}
              badge_un_150={item.badge_un_150}
              badge_premium={item.badge_premium}
              auth={item.auth}
            />
          )}
          keyExtractor={(item) => item.user_id.toString()}
          contentContainerStyle={{ paddingBottom: 16, paddingTop: 8 }}
          showsVerticalScrollIndicator={false}
        />
      </View>

      <FilterModal
        isModalVisible={isModalVisible}
        setModalVisible={(value) => setModalVisible(value)}
        applyFilter={(filterAge, filterRanking, filterCountry) => {
          setConfirmedValueRanking(filterRanking);
          setFilteredData(
            applyModalSort(
              allParticipants ?? [],
              filterAge,
              filterRanking ?? dataRanking[0],
              filterCountry
            )
          );
          setModalVisible(false);
        }}
        countriesData={masterCountries ? masterCountries.data : []}
      />
      <OptionsModal />
      <WarningModal
        type={'delete'}
        isVisible={modalState.isWarningVisible}
        buttonTitle={modalState.buttonTitle}
        message={modalState.message}
        action={modalState.action}
        onClose={() => setModalState({ ...modalState, isWarningVisible: false })}
        title={modalState.title}
      />
    </PageWrapper>
  );
};

const styles = StyleSheet.create({
  container: {
    backgroundColor: 'white',
    gap: 16,
    flex: 1
  }
});

export default ParticipantsListScreen;