from typing import TYPE_CHECKING if TYPE_CHECKING: from warchron.controller.app_controller import AppController from warchron.model.war import War from warchron.model.campaign import Campaign from warchron.model.round import Round from warchron.model.closure_service import ClosureService from warchron.model.tie_manager import TieResolver class ClosureWorkflow: def __init__(self, controller: "AppController"): self.app = controller class RoundClosureWorkflow(ClosureWorkflow): def start(self, war: War, campaign: Campaign, round: Round) -> None: ClosureService.check_round_closable(round) ties = TieResolver.find_battle_ties(war, round.id) while ties: bids_map = self.app.rounds.resolve_ties(war, ties) for tie in ties: bids = bids_map[(tie.context_type, tie.context_id, tie.score_value)] TieResolver.apply_bids(war, tie.context_type, tie.context_id, bids) TieResolver.resolve_tie_state(war, tie, bids) ties = TieResolver.find_battle_ties(war, round.id) for battle in round.battles.values(): ClosureService.apply_battle_outcomes(war, campaign, battle) ClosureService.finalize_round(round) class CampaignClosureWorkflow(ClosureWorkflow): def start(self, war: War, campaign: Campaign) -> None: ClosureService.check_campaign_closable(campaign) ties = TieResolver.find_campaign_ties(war, campaign.id) while ties: bids_map = self.app.campaigns.resolve_ties(war, ties) for tie in ties: bids = bids_map[(tie.context_type, tie.context_id, tie.score_value)] TieResolver.apply_bids(war, tie.context_type, tie.context_id, bids) TieResolver.resolve_tie_state(war, tie, bids) ties = TieResolver.find_campaign_ties(war, campaign.id) ClosureService.finalize_campaign(campaign) class WarClosureWorkflow(ClosureWorkflow): def start(self, war: War) -> None: ClosureService.check_war_closable(war) ties = TieResolver.find_war_ties(war) while ties: bids_map = self.app.wars.resolve_ties(war, ties) for tie in ties: bids = bids_map[(tie.context_type, tie.context_id, tie.score_value)] TieResolver.apply_bids(war, tie.context_type, tie.context_id, bids) TieResolver.resolve_tie_state(war, tie, bids) ties = TieResolver.find_war_ties(war) ClosureService.finalize_war(war)