import { 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,
  isSuperTournament: boolean,
}

export const useTournaments = (matches: Array<Match>) => {
  const {
    selectedLeague,
    selectedSport,
  } = 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 tournaments = matches.reduce((acc: TournamentListProps, match: Match) => {
    if (matches.length === 0) return {}

    const tournamentInFavorites = isInFavorites(
      ProfileTypes.TOURNAMENTS,
      // в избранном могут быть только обычные турниры
      match.tournament.is_super_tournament ? match.group.id : 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,
        isSuperTournament: Boolean(match.tournament.is_super_tournament),
      })
    } 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', 'isSuperTournament'],
    ['desc', 'desc', 'desc'],
  ), [tournamentSort])

  return {
    tournamentSort: tournamentsSorted,
    tournaments,
  }
}
