import { useEffect } from 'react'
import { getSportLexic } from 'helpers/getSportLexic'

import { TournamentListProps } from 'features/TournamentList'
import type { Match } from 'features/Matches'
import { useHeaderFiltersStore } from 'features/HeaderFilters'

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

  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)
  }

  const tournamentSort: Array<number> = []
  const sportIds = new Set<number>([])

  const tournaments = matches.reduce((acc: TournamentListProps, match: Match) => {
    if (matches.length === 0) return {}
    if (!acc[match.tournament.id] && compareSport(match, selectedSport)
    && compareLeague(match.tournament.id)) {
      const tournament = {
        ...match.tournament,
        countryId: match.countryId,
        live: match.live,
        matches: [match],
        sportType: match.sportType,
      }
      acc[match.tournament.id] = {
        tournament: {
          ...tournament,
        },
        tournamentMatches: [match],
      }
      tournamentSort.push(match.tournament.id)
      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
  }, {})

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

  return {
    tournamentSort,
    tournaments,
  }
}
