import type { FacetDistribution, SearchContext } from '../../types/index.js'

function getFacetNames(
  facets: SearchContext['facets'] | string
): readonly string[] {
  if (!facets) return []
  else if (typeof facets === 'string') return [facets]
  return facets
}

// Fills the missing facetValue in the current facet distribution if `keepZeroFacet` is true
// using the initial facet distribution. Ex:
//
// Initial distribution: { genres: { horror: 10, comedy: 4 } }
// Current distribution: { genres: { horror: 3 }}
// Returned distribution: { genres: { horror: 3, comedy: 0 }}
function fillMissingFacetValues(
  facets: SearchContext['facets'] | string,
  initialFacetDistribution: FacetDistribution,
  facetDistribution: FacetDistribution
): FacetDistribution {
  const facetNames = getFacetNames(facets)
  const filledDistribution: FacetDistribution = {}

  for (const facet of facetNames) {
    for (const facetValue in initialFacetDistribution[facet]) {
      if (!filledDistribution[facet]) {
        // initialize sub object
        filledDistribution[facet] = facetDistribution[facet] || {}
      }
      if (!filledDistribution[facet][facetValue]) {
        filledDistribution[facet][facetValue] = 0
      } else {
        filledDistribution[facet][facetValue] =
          facetDistribution[facet][facetValue]
      }
    }
  }

  return filledDistribution
}

function adaptFacetDistribution(
  keepZeroFacets: boolean,
  facets: SearchContext['facets'] | string,
  initialFacetDistribution: FacetDistribution,
  facetDistribution: FacetDistribution | undefined
) {
  if (keepZeroFacets) {
    facetDistribution = facetDistribution || {}
    return fillMissingFacetValues(
      facets,
      initialFacetDistribution,
      facetDistribution
    )
  }
  return facetDistribution
}

export { adaptFacetDistribution }
