MatchProposal   A
last analyzed

Complexity

Total Complexity 8

Size/Duplication

Total Lines 63
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 26
c 1
b 0
f 0
dl 0
loc 63
rs 10
wmc 8

6 Methods

Rating   Name   Duplication   Size   Complexity  
A proposedTo() 0 3 1
A proposedBy() 0 3 1
A __construct() 0 15 1
A id() 0 3 1
A accept() 0 7 2
A start() 0 9 2
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