MatchProposal::accept()   A
last analyzed

Complexity

Conditions 2
Paths 2

Size

Total Lines 7
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 2
eloc 4
c 1
b 0
f 0
nc 2
nop 1
dl 0
loc 7
rs 10
1
<?php declare(strict_types=1);
2
3
namespace Stratadox\CardGame\Proposal;
4
5
use DateTimeInterface;
6
use Stratadox\CardGame\DomainEventRecorder;
7
use Stratadox\CardGame\DomainEventRecording;
8
use Stratadox\CardGame\Account\AccountId;
9
use Stratadox\CardGame\Match\Decks;
10
use Stratadox\CardGame\Match\Match;
11
use Stratadox\CardGame\Match\MatchId;
12
13
final class MatchProposal implements DomainEventRecorder
14
{
15
    use DomainEventRecording;
16
17
    private $id;
18
    private $validUntil;
19
    private $isAccepted;
20
    private $proposedBy;
21
    private $proposedTo;
22
23
    public function __construct(
24
        ProposalId $proposalId,
25
        AccountId $proposedBy,
26
        AccountId $proposedTo,
27
        DateTimeInterface $validUntil
28
    ) {
29
        $this->id = $proposalId;
30
        $this->validUntil = $validUntil;
31
        $this->proposedTo = $proposedTo;
32
        $this->proposedBy = $proposedBy;
33
        $this->events[] = new MatchWasProposed(
34
            $proposalId,
35
            $proposedBy,
36
            $proposedTo,
37
            $validUntil
38
        );
39
    }
40
41
    public function id(): ProposalId
42
    {
43
        return $this->id;
44
    }
45
46
    /** @throws ProposalHasAlreadyExpired */
47
    public function accept(DateTimeInterface $now): void
48
    {
49
        if ($now > $this->validUntil) {
50
            throw ProposalHasAlreadyExpired::cannotAcceptItAnymore();
51
        }
52
        $this->isAccepted = true;
53
        $this->events[] = new ProposalWasAccepted($this->id);
54
    }
55
56
    public function proposedBy(): AccountId
57
    {
58
        return $this->proposedBy;
59
    }
60
61
    public function proposedTo(): AccountId
62
    {
63
        return $this->proposedTo;
64
    }
65
66
    /** @throws ProposalHasNotBeenAccepted */
67
    public function start(
68
        MatchId $match,
69
        Decks $decks,
70
        DateTimeInterface $when
71
    ): Match {
72
        if (!$this->isAccepted) {
73
            throw ProposalHasNotBeenAccepted::cannotStartMatch();
74
        }
75
        return Match::fromProposal($match, $this->id, $decks, $when);
76
    }
77
}
78