from typing import TYPE_CHECKING if TYPE_CHECKING: from warchron.controller.app_controller import AppController from warchron.model.war_event import TieResolved 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: resolvable = [] for tie in ties: if TieResolver.can_tie_be_resolved(war, tie.participants): resolvable.append(tie) else: war.events.append( TieResolved( participant_id=None, # draw confirmed context_type=tie.context_type, context_id=tie.context_id, ) ) if not resolvable: break bids_map = self.app.rounds.resolve_ties(war, resolvable) for tie in resolvable: bids = bids_map[tie.context_id] TieResolver.apply_bids( war, tie.context_type, tie.context_id, bids, ) TieResolver.try_tie_break( war, tie.context_type, tie.context_id, tie.participants, ) 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: resolvable = [] for tie in ties: if TieResolver.can_tie_be_resolved(war, tie.participants): resolvable.append(tie) else: war.events.append( TieResolved( participant_id=None, context_type=tie.context_type, context_id=tie.context_id, ) ) if not resolvable: break bids_map = self.app.campaigns.resolve_ties(war, resolvable) for tie in resolvable: bids = bids_map[tie.context_id] TieResolver.apply_bids( war, tie.context_type, tie.context_id, bids, ) TieResolver.try_tie_break( war, tie.context_type, tie.context_id, tie.participants, ) ties = TieResolver.find_campaign_ties(war, campaign.id) ClosureService.finalize_campaign(campaign)