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.key()] TieResolver.apply_bids(war, tie, 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.key()] TieResolver.apply_bids(war, tie, bids) TieResolver.resolve_tie_state(war, tie, bids) ties = TieResolver.find_campaign_ties(war, campaign.id) for objective_id in war.objectives: ties = TieResolver.find_campaign_objective_ties( war, campaign.id, objective_id, ) while ties: bids_map = self.app.campaigns.resolve_ties(war, ties) for tie in ties: bids = bids_map[tie.key()] TieResolver.apply_bids(war, tie, bids) TieResolver.resolve_tie_state(war, tie, bids) ties = TieResolver.find_campaign_objective_ties( war, campaign.id, objective_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.key()] TieResolver.apply_bids(war, tie, bids) TieResolver.resolve_tie_state(war, tie, bids) ties = TieResolver.find_war_ties(war) for objective_id in war.objectives: ties = TieResolver.find_war_objective_ties( war, objective_id, ) while ties: bids_map = self.app.wars.resolve_ties(war, ties) for tie in ties: bids = bids_map[tie.key()] TieResolver.apply_bids(war, tie, bids) TieResolver.resolve_tie_state(war, tie, bids) ties = TieResolver.find_war_objective_ties( war, objective_id, ) ClosureService.finalize_war(war)