import { useEffect, useMemo } from 'react'

import orderBy from 'lodash/orderBy'

import { getSportLexic } from 'helpers/getSportLexic'

import { ProfileTypes } from 'config'
import { TournamentListProps } from 'features/TournamentList'
import type { Match } from 'features/Matches'
import { useHeaderFiltersStore } from 'features/HeaderFilters'
import { useUserFavoritesStore } from 'features/UserFavorites/store'

interface TournamentsSortProps {
  id: number,
  isFavorite: boolean,
  isLive: boolean,
}

export const useTournaments = (matches: Array<Match>) => {
  const {
    selectedDate,
    selectedLeague,
    selectedSport,
    setSportIds,
  } = useHeaderFiltersStore()
  const { isInFavorites } = useUserFavoritesStore()

  const compareSport = (match: Match, sportNames: Array<string>) => {
    if (sportNames[0] === 'all_sports') {
      return true
    }
    const sport = getSportLexic(match.sportType)
    return (sportNames.indexOf(sport) >= 0 || sportNames.indexOf(`${sport}_popup`) >= 0)
  }

  const compareLeague = (id: number) => {
    if (selectedLeague[0] === 'all_competitions') {
      return true
    }
    return (selectedLeague.indexOf(id) >= 0)
  }

  // eslint-disable-next-line react-hooks/exhaustive-deps
  const tournamentSort: Array<TournamentsSortProps> = []
  const sportIds = new Set<number>([])

  const tournaments = matches.reduce((acc: TournamentListProps, match: Match) => {
    if (matches.length === 0) return {}

    const tournamentInFavorites = isInFavorites(
      ProfileTypes.TOURNAMENTS,
      match.tournament.id,
    )

    if (!acc[match.tournament.id] && compareSport(match, selectedSport)
      && compareLeague(match.tournament.id)) {
      const tournament = {
        ...match.tournament,
        countryId: match.countryId,
        isFavorite: tournamentInFavorites,
        live: match.live,
        matches: [match],
        sportType: match.sportType,
      }
      acc[match.tournament.id] = {
        tournament: {
          ...tournament,
        },
        tournamentMatches: [match],
      }
      tournamentSort.push({
        id: match.tournament.id,
        isFavorite: tournamentInFavorites,
        isLive: match.live,
      })
      sportIds.add(match.sportType)
    } else if (compareSport(match, selectedSport) && compareLeague(match.tournament.id)) {
      acc[match.tournament.id] = {
        ...acc[match.tournament.id],
        tournament: {
          ...acc[match.tournament.id].tournament,
          live: acc[match.tournament.id]?.tournament.live
            ? acc[match.tournament.id]?.tournament.live
            : match.live,
        },
        tournamentMatches: [...acc[match.tournament.id].tournamentMatches, match],
      }
    }
    return acc
  }, {})

  const tournamentsSorted = useMemo(() => orderBy(
    tournamentSort,
    ['isLive', 'isFavorite'],
    ['desc', 'desc'],
  ), [tournamentSort])

  useEffect(() => {
    sportIds && setSportIds(sportIds)
    // eslint-disable-next-line react-hooks/exhaustive-deps
  }, [selectedDate, matches])

  return {
    tournamentSort: tournamentsSorted,
    tournaments,
  }
}
