Test Setup Failed
Push — master ( a63fa0...36623d )
by Jesse
04:59
created

BattlefieldUpdater::update()   A

Complexity

Conditions 6
Paths 6

Size

Total Lines 15
Code Lines 12

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 6
eloc 12
c 0
b 0
f 0
nc 6
nop 2
dl 0
loc 15
rs 9.2222
1
<?php declare(strict_types=1);
2
3
namespace Stratadox\CardGame\EventHandler;
4
5
use Stratadox\CardGame\DomainEvent;
6
use Stratadox\CardGame\Match\Event\UnitDied;
7
use Stratadox\CardGame\Match\Event\UnitMovedIntoPlay;
8
use Stratadox\CardGame\Match\Event\UnitMovedToAttack;
9
use Stratadox\CardGame\Match\Event\UnitMovedToDefend;
10
use Stratadox\CardGame\Match\Event\UnitRegrouped;
11
use Stratadox\CardGame\Match\MatchEvent;
12
use Stratadox\CardGame\ReadModel\Match\Battlefield;
13
use Stratadox\CardGame\ReadModel\Match\Card;
14
use Stratadox\CardGame\ReadModel\Match\CardTemplates;
15
use Stratadox\CardGame\ReadModel\Match\Battlefields;
16
use function assert;
17
18
final class BattlefieldUpdater implements EventHandler
19
{
20
    private $battlefield;
21
    private $cardTemplate;
22
23
    public function __construct(
24
        Battlefields $battlefield,
25
        CardTemplates $templates
26
    ) {
27
        $this->battlefield = $battlefield;
28
        $this->cardTemplate = $templates;
29
    }
30
31
    public function events(): iterable
32
    {
33
        return [
34
            UnitMovedIntoPlay::class,
35
            UnitMovedToAttack::class,
36
            UnitMovedToDefend::class,
37
            UnitRegrouped::class,
38
            UnitDied::class,
39
        ];
40
    }
41
42
    public function handle(DomainEvent $event): void
43
    {
44
        assert($event instanceof MatchEvent);
45
        $this->update($this->battlefield->for($event->aggregateId()), $event);
46
    }
47
48
    private function update(Battlefield $battlefield, MatchEvent $event): void
49
    {
50
        if ($event instanceof UnitMovedIntoPlay) {
51
            $battlefield->addFor($event->player(), new Card(
52
                $event->offset(),
53
                $this->cardTemplate->ofType($event->card())
54
            ));
55
        } elseif ($event instanceof UnitMovedToAttack) {
56
            $battlefield->getSentIntoBattleBy($event->player(), $event->offset());
57
        } elseif ($event instanceof UnitMovedToDefend) {
58
            $battlefield->getSentToDefendBy($event->player(), $event->offset());
59
        } elseif ($event instanceof UnitRegrouped) {
60
            $battlefield->getSentToRegroupBy($event->player(), $event->offset());
61
        } elseif ($event instanceof UnitDied) {
62
            $battlefield->removeFrom($event->player(), $event->offset());
63
        }
64
    }
65
}
66