def makeFront()

in common/app/services/IndexPage.scala [58:188]


  def makeFront(indexPage: IndexPage, edition: Edition)(implicit context: ApplicationContext): Front = {
    val isCartoonPage = indexPage.isTagWithId("type/cartoon")
    val isReviewPage = indexPage.isTagWithId("tone/reviews")

    val isSlow = SlowOrFastByTrails.isSlow(indexPage.trails.map(_.trail))

    @tailrec
    def containerDefinition(
        groupings: Seq[IndexPageGrouping],
        mpuState: MpuState,
        accumulation: Vector[((ContainerDisplayConfig, CollectionEssentials), Container)] = Vector.empty,
    ): Seq[((ContainerDisplayConfig, CollectionEssentials), Container)] = {
      groupings.toList match {
        case Nil => accumulation
        case grouping :: remainingGroupings =>
          val collection = CollectionEssentials.fromFaciaContent(
            grouping.items.flatMap { item =>
              indexPage.contents.find(_.item.metadata.id == item.metadata.id).map(_.faciaItem)
            },
          )

          val mpuContainer = (if (isSlow)
                                slowContainerWithMpu(grouping.items.length)
                              else
                                fastContainerWithMpu(grouping.items.length)).filter(const(!mpuState.injected))

          val (container, newMpuState) = mpuContainer map { mpuContainer =>
            (mpuContainer, mpuState.copy(injected = true))
          } getOrElse {
            val definition = if (isSlow) {
              ContainerDefinition.slowForNumberOfItems(grouping.items.length)
            } else {
              ContainerDefinition.fastForNumberOfItems(grouping.items.length)
            }

            (definition, mpuState)
          }

          val containerConfig = ContainerDisplayConfig(
            CollectionConfigWithId(
              grouping.dateHeadline.displayString,
              CollectionConfig.empty.copy(
                displayName = Some(grouping.dateHeadline.displayString),
              ),
            ),
            showSeriesAndBlogKickers = true,
          )

          containerDefinition(
            remainingGroupings,
            newMpuState,
            accumulation :+ ((containerConfig, collection), Fixed(container)),
          )
      }

    }

    val grouped =
      if (isSlow || indexPage.forcesDayView)
        IndexPageGrouping.byDay(indexPage.trails, edition.timezone)
      else
        IndexPageGrouping.fromContent(indexPage.trails, edition.timezone)

    val front = Front.fromConfigsAndContainers(
      containerDefinition(grouped.toList, MpuState(injected = false)),
      ContainerLayoutContext(
        Set.empty,
        hideCutOuts = indexPage.tags.isContributorPage,
      ),
    )

    val headers = grouped.map(_.dateHeadline).zipWithIndex map { case (headline, index) =>
      if (index == 0) {
        indexPage.page match {
          case tag: Tag         => FaciaContainerHeader.fromTagPage(tag, headline)
          case section: Section => FaciaContainerHeader.fromSection(section, headline)
          case page: Page       => FaciaContainerHeader.fromPage(page, headline)
          case _                =>
            // should never happen
            LoneDateHeadline(headline)
        }
      } else {
        LoneDateHeadline(headline)
      }
    }

    front.copy(containers =
      front.containers
        .zip(headers)
        .map({ case (container, header) =>
          val timeStampDisplay = header match {
            case MetaDataHeader(_, _, _, dateHeadline, _) => Some(cardTimestampDisplay(dateHeadline))
            case LoneDateHeadline(dateHeadline)           => Some(cardTimestampDisplay(dateHeadline))
            case DescriptionMetaHeader(_)                 => None
          }
          container
            .copy(
              customHeader = Some(header),
              customClasses = Some(
                Seq(
                  Some("fc-container--tag"),
                  if (
                    container.index == 0 &&
                    indexPage.isFootballTeam &&
                    Switches.FixturesAndResultsContainerSwitch.isSwitchedOn
                  ) Some("js-insert-team-stats-after")
                  else None,
                ).flatten,
              ),
              hideToggle = true,
              showTimestamps = true,
              useShowMore = false,
              dateLinkPath = Some(s"/${indexPage.idWithoutEdition}"),
            )
            .transformCards({ card =>
              card
                .copy(
                  timeStampDisplay = timeStampDisplay,
                  byline = if (indexPage.tags.isContributorPage) None else card.byline,
                  useShortByline = true,
                )
                .setKicker(card.header.kicker flatMap {
                  case ReviewKicker if isReviewPage                        => None
                  case CartoonKicker if isCartoonPage                      => None
                  case TagKicker(_, _, _, id) if indexPage.isTagWithId(id) => None
                  case otherKicker                                         => Some(otherKicker)
                })
            })
        }),
    )
  }