MinistryRankingCurrentPartiesLeaderScoreboardChartsPageModContentFactoryImpl.java

  1. package com.hack23.cia.web.impl.ui.application.views.user.govermentranking.pagemode;

  2. import java.util.List;
  3. import java.util.Locale;
  4. import java.util.Map;
  5. import java.util.stream.Collectors;

  6. import org.springframework.beans.factory.annotation.Autowired;
  7. import org.springframework.security.access.annotation.Secured;
  8. import org.springframework.stereotype.Service;

  9. import com.hack23.cia.model.internal.application.data.ministry.impl.ViewRiksdagenGovermentRoleMember;
  10. import com.hack23.cia.model.internal.application.data.politician.impl.ViewRiksdagenPolitician;
  11. import com.hack23.cia.model.internal.application.data.politician.impl.ViewRiksdagenPoliticianBallotSummary;
  12. import com.hack23.cia.model.internal.application.data.politician.impl.ViewRiksdagenPoliticianExperienceSummary;
  13. import com.hack23.cia.model.internal.application.system.impl.ApplicationEventGroup;
  14. import com.hack23.cia.service.external.esv.api.EsvApi;
  15. import com.hack23.cia.service.external.esv.api.GovernmentBodyAnnualOutcomeSummary;
  16. import com.hack23.cia.service.external.esv.api.GovernmentBodyAnnualSummary;
  17. import com.hack23.cia.web.impl.ui.application.action.ViewAction;
  18. import com.hack23.cia.web.impl.ui.application.views.common.menufactory.api.pagecommands.PageCommandMinistryRankingConstants;
  19. import com.hack23.cia.web.impl.ui.application.views.common.pagemode.CardInfoRowUtil;
  20. import com.hack23.cia.web.impl.ui.application.views.common.pagemode.LeaderCardUtil;
  21. import com.hack23.cia.web.impl.ui.application.views.common.pagemode.PartyLeaderUtil;
  22. import com.hack23.cia.web.impl.ui.application.views.common.rows.RowUtil;
  23. import com.jarektoro.responsivelayout.ResponsiveRow;
  24. import com.vaadin.ui.Layout;
  25. import com.vaadin.ui.MenuBar;
  26. import com.vaadin.ui.Panel;
  27. import com.vaadin.ui.VerticalLayout;

  28. /**
  29.  * The Class MinistryRankingCurrentPartiesLeaderScoreboardChartsPageModContentFactoryImpl.
  30.  */
  31. @Service
  32. public final class MinistryRankingCurrentPartiesLeaderScoreboardChartsPageModContentFactoryImpl
  33.         extends AbstractMinistryRankingPageModContentFactoryImpl {

  34.     /** The Constant DISPLAY_SIZE_LG_DEVICE. */
  35.     private static final int DISPLAY_SIZE_LG_DEVICE = 4;

  36.     /** The Constant DISPLAY_SIZE_MD_DEVICE. */
  37.     private static final int DISPLAY_SIZE_MD_DEVICE = 4;

  38.     /** The Constant DISPLAY_SIZE_XS_DEVICE. */
  39.     private static final int DISPLAY_SIZE_XS_DEVICE = 12;

  40.     /** The Constant DISPLAYS_SIZE_XM_DEVICE. */
  41.     private static final int DISPLAYS_SIZE_XM_DEVICE = 6;

  42.     /** The Constant CURRENT_YEAR. */
  43.     private static final int CURRENT_YEAR = 2024;

  44.     /** The esv api. */
  45.     private final EsvApi esvApi;

  46.     /** The leader card util. */
  47.     @Autowired
  48.     private LeaderCardUtil leaderCardUtil;

  49.     /**
  50.      * Instantiates a new ministry ranking current parties leader scoreboard charts page mod content factory impl.
  51.      *
  52.      * @param esvApi the esv api
  53.      */
  54.     public MinistryRankingCurrentPartiesLeaderScoreboardChartsPageModContentFactoryImpl(final EsvApi esvApi) {
  55.         super();
  56.         this.esvApi = esvApi;
  57.     }

  58.     /**
  59.      * Creates the content.
  60.      *
  61.      * @param parameters the parameters
  62.      * @param menuBar the menu bar
  63.      * @param panel the panel
  64.      * @return the layout
  65.      */
  66.     @Secured({ "ROLE_ANONYMOUS", "ROLE_USER", "ROLE_ADMIN" })
  67.     @Override
  68.     public Layout createContent(final String parameters, final MenuBar menuBar, final Panel panel) {
  69.         panel.setSizeFull();

  70.         final VerticalLayout panelContent = createPanelContent();
  71.         panelContent.setSizeFull();
  72.         panel.setContent(panelContent);

  73.         getMinistryRankingMenuItemFactory().createMinistryRankingMenuBar(menuBar);

  74.         final String pageId = getPageId(parameters);

  75.         CardInfoRowUtil.createPageHeader(panel, panelContent,
  76.             MinistryRankingViewConstants.TITLE_MINISTRY_RANKINGS,
  77.             MinistryRankingViewConstants.LEADER_SCOREBOARD_TITLE,
  78.             MinistryRankingViewConstants.LEADER_SCOREBOARD_DESC);

  79.         final ResponsiveRow row = RowUtil.createGridLayout(panelContent);
  80.         row.setSizeFull();

  81.         final List<ViewRiksdagenGovermentRoleMember> activeGovMembers = leaderCardUtil.loadActiveGovernmentRoleMembers();
  82.         final Map<String, List<ViewRiksdagenPolitician>> activePoliticianMap = leaderCardUtil.loadActivePoliticiansByPersonId();

  83.         final Map<String, Boolean> partyLeaderMap = PartyLeaderUtil.computePartyLeaders( getApplicationManager() ,activePoliticianMap.keySet());

  84.         // Sort roles
  85.         activeGovMembers.sort((a, b) -> {
  86.             final boolean aLeader = partyLeaderMap.getOrDefault(a.getPersonId(), false);
  87.             final boolean bLeader = partyLeaderMap.getOrDefault(b.getPersonId(), false);
  88.             final int aPriority = getRolePriority(a.getRoleCode(), aLeader);
  89.             final int bPriority = getRolePriority(b.getRoleCode(), bLeader);
  90.             return Integer.compare(aPriority, bPriority);
  91.         });

  92.         final Map<Integer, List<GovernmentBodyAnnualSummary>> dataMap = esvApi.getData();
  93.         final List<GovernmentBodyAnnualSummary> currentYearGovernmentBodies = dataMap.get(CURRENT_YEAR);
  94.         final Map<String, List<GovernmentBodyAnnualSummary>> governmentBodyByMinistry = currentYearGovernmentBodies
  95.                 .stream().collect(Collectors.groupingBy(GovernmentBodyAnnualSummary::getMinistry));

  96.         final Map<String, List<GovernmentBodyAnnualOutcomeSummary>> reportByMinistry = esvApi
  97.                 .getGovernmentBodyReportByMinistry();

  98.         for (final ViewRiksdagenGovermentRoleMember govMember : activeGovMembers) {
  99.             final ViewRiksdagenPolitician politician = activePoliticianMap.get(govMember.getPersonId()).get(0);
  100.             final ViewRiksdagenPoliticianBallotSummary ballotSummary = getApplicationManager()
  101.                     .getDataContainer(ViewRiksdagenPoliticianBallotSummary.class).load(govMember.getPersonId());
  102.             final ViewRiksdagenPoliticianExperienceSummary experienceSummary = getApplicationManager().getDataContainer(ViewRiksdagenPoliticianExperienceSummary.class).load(govMember.getPersonId());


  103.             final Panel cardPanel = leaderCardUtil.createBaseballStyleCard(govMember, politician, ballotSummary, governmentBodyByMinistry,
  104.                     reportByMinistry,experienceSummary);

  105.             // Responsive column rules
  106.             row.addColumn().withDisplayRules(DISPLAY_SIZE_XS_DEVICE, DISPLAYS_SIZE_XM_DEVICE, DISPLAY_SIZE_MD_DEVICE,
  107.                     DISPLAY_SIZE_LG_DEVICE).withComponent(cardPanel);
  108.         }

  109.         getPageActionEventHelper().createPageEvent(ViewAction.VISIT_MINISTRY_RANKING_VIEW, ApplicationEventGroup.USER,
  110.                 NAME, parameters, pageId);

  111.         return panelContent;
  112.     }

  113.     /**
  114.      * Gets the role priority.
  115.      *
  116.      * @param role the role
  117.      * @param isPartyLeader the is party leader
  118.      * @return the role priority
  119.      */
  120.     private int getRolePriority(final String role, final boolean isPartyLeader) {
  121.         final String roleNormalized = role.toLowerCase(Locale.ROOT).trim();
  122.         if ("statsminister".equals(roleNormalized)) {
  123.             return 1;
  124.         } else if (isPartyLeader) {
  125.             return 2;
  126.         } else if (roleNormalized.endsWith("minister")) {
  127.             return 3;
  128.         } else if ("statsråd".equalsIgnoreCase(roleNormalized)) {
  129.             return 4;
  130.         } else {
  131.             return 5;
  132.         }
  133.     }

  134.     /**
  135.      * Matches.
  136.      *
  137.      * @param page the page
  138.      * @param parameters the parameters
  139.      * @return true, if successful
  140.      */
  141.     @Override
  142.     public boolean matches(final String page, final String parameters) {
  143.         return PageCommandMinistryRankingConstants.COMMAND_CHARTS_CURRENT_MINISTRIES_LEADER_SCOREBOARD.matches(page, parameters);
  144.     }
  145. }