Completed
Pull Request — master (#19)
by Antonio Oertel
03:06
created

StateRegistration::calculateDigit()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 6
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 3
CRAP Score 1

Importance

Changes 1
Bugs 0 Features 1
Metric Value
c 1
b 0
f 1
dl 0
loc 6
ccs 3
cts 3
cp 1
rs 9.4285
cc 1
eloc 3
nc 1
nop 1
crap 1
1
<?php
2
3
namespace Brazanation\Documents;
4
5
use Brazanation\Documents\StateRegistration\Acre;
6
use Brazanation\Documents\StateRegistration\Alagoas;
7
use Brazanation\Documents\StateRegistration\Amapa;
8
use Brazanation\Documents\StateRegistration\Amazonas;
9
use Brazanation\Documents\StateRegistration\Bahia;
10
use Brazanation\Documents\StateRegistration\Ceara;
11
use Brazanation\Documents\StateRegistration\DistritoFederal;
12
use Brazanation\Documents\StateRegistration\EspiritoSanto;
13
use Brazanation\Documents\StateRegistration\Goias;
14
use Brazanation\Documents\StateRegistration\Maranhao;
15
use Brazanation\Documents\StateRegistration\MatoGrosso;
16
use Brazanation\Documents\StateRegistration\MatoGrossoSul;
17
use Brazanation\Documents\StateRegistration\MinasGerais;
18
use Brazanation\Documents\StateRegistration\Para;
19
use Brazanation\Documents\StateRegistration\Paraiba;
20
use Brazanation\Documents\StateRegistration\Parana;
21
use Brazanation\Documents\StateRegistration\Pernambuco;
22
use Brazanation\Documents\StateRegistration\Piaui;
23
use Brazanation\Documents\StateRegistration\RioDeJaneiro;
24
use Brazanation\Documents\StateRegistration\RioGrandeDoNorte;
25
use Brazanation\Documents\StateRegistration\RioGrandeDoSul;
26
use Brazanation\Documents\StateRegistration\Rondonia;
27
use Brazanation\Documents\StateRegistration\Roraima;
28
use Brazanation\Documents\StateRegistration\SantaCatarina;
29
use Brazanation\Documents\StateRegistration\SaoPaulo;
30
use Brazanation\Documents\StateRegistration\Sergipe;
31
use Brazanation\Documents\StateRegistration\StateInterface;
32
use Brazanation\Documents\StateRegistration\Tocantins;
33
34
/**
35
 * Class StateRegistration
36
 *
37
 * @package Brazanation\Documents
38
 *
39
 * @method static StateRegistration AC($number)
40
 * @method static StateRegistration AL($number)
41
 * @method static StateRegistration AM($number)
42
 * @method static StateRegistration AP($number)
43
 * @method static StateRegistration BA($number)
44
 * @method static StateRegistration CE($number)
45
 * @method static StateRegistration DF($number)
46
 * @method static StateRegistration ES($number)
47
 * @method static StateRegistration GO($number)
48
 * @method static StateRegistration MA($number)
49
 * @method static StateRegistration MG($number)
50
 * @method static StateRegistration MS($number)
51
 * @method static StateRegistration MT($number)
52
 * @method static StateRegistration PA($number)
53
 * @method static StateRegistration PB($number)
54
 * @method static StateRegistration PE($number)
55
 * @method static StateRegistration PI($number)
56
 * @method static StateRegistration PR($number)
57
 * @method static StateRegistration RJ($number)
58
 * @method static StateRegistration RN($number)
59
 * @method static StateRegistration RO($number)
60
 * @method static StateRegistration RR($number)
61
 * @method static StateRegistration RS($number)
62
 * @method static StateRegistration SC($number)
63
 * @method static StateRegistration SE($number)
64
 * @method static StateRegistration SP($number)
65
 * @method static StateRegistration TO($number)
66
 */
67
final class StateRegistration extends AbstractDocument implements DocumentInterface
68
{
69
    /**
70
     * @var StateInterface
71
     */
72
    private $state;
73
74
    /**
75
     * @var array
76
     */
77
    private static $availableStates = [
78
        Acre::SHORT_NAME => Acre::class,
79
        Alagoas::SHORT_NAME => Alagoas::class,
80
        Amapa::SHORT_NAME => Amapa::class,
81
        Amazonas::SHORT_NAME => Amazonas::class,
82
        Bahia::SHORT_NAME => Bahia::class,
83
        Ceara::SHORT_NAME => Ceara::class,
84
        DistritoFederal::SHORT_NAME => DistritoFederal::class,
85
        EspiritoSanto::SHORT_NAME => EspiritoSanto::class,
86
        Goias::SHORT_NAME => Goias::class,
87
        Maranhao::SHORT_NAME => Maranhao::class,
88
        MatoGrosso::SHORT_NAME => MatoGrosso::class,
89
        MatoGrossoSul::SHORT_NAME => MatoGrossoSul::class,
90
        MinasGerais::SHORT_NAME => MinasGerais::class,
91
        Para::SHORT_NAME => Para::class,
92
        Paraiba::SHORT_NAME => Paraiba::class,
93
        Parana::SHORT_NAME => Parana::class,
94
        Pernambuco::SHORT_NAME => Pernambuco::class,
95
        Piaui::SHORT_NAME => Piaui::class,
96
        RioDeJaneiro::SHORT_NAME => RioDeJaneiro::class,
97
        RioGrandeDoNorte::SHORT_NAME => RioGrandeDoNorte::class,
98
        RioGrandeDoSul::SHORT_NAME => RioGrandeDoSul::class,
99
        Rondonia::SHORT_NAME => Rondonia::class,
100
        Roraima::SHORT_NAME => Roraima::class,
101
        SantaCatarina::SHORT_NAME => SantaCatarina::class,
102
        SaoPaulo::SHORT_NAME => SaoPaulo::class,
103
        Sergipe::SHORT_NAME => Sergipe::class,
104
        Tocantins::SHORT_NAME => Tocantins::class,
105
    ];
106
107
    /**
108
     * StateRegistration constructor.
109
     *
110
     * @param string         $number
111
     * @param StateInterface $state
112
     */
113 476
    public function __construct($number, StateInterface $state)
114
    {
115 476
        $number = $state->normalizeNumber($number);
116 476
        $this->state = $state;
117 476
        parent::__construct($number, $state->getLength(), $state->getNumberOfDigits(), $state->getState());
118 383
    }
119
120
    /**
121
     * @param string $name
122
     * @param array  $arguments
123
     *
124
     * @return StateRegistration
125
     */
126 20
    public static function __callStatic($name, $arguments)
127
    {
128 20
        $class = self::$availableStates[$name];
129 20
        $reflection = new \ReflectionClass($class);
130
131
        /** @var StateInterface $state */
132 20
        $state = $reflection->newInstanceArgs();
133
134 20
        return new self($arguments[0], $state);
135
    }
136
137
    /**
138
     * {@inheritdoc}
139
     */
140 437
    protected function extractBaseNumber($number)
141
    {
142 437
        return $this->state->extractBaseNumber($number);
143
    }
144
145
    /**
146
     * {@inheritdoc}
147
     */
148 476
    protected function extractCheckerDigit($number)
149
    {
150 476
        return $this->state->extractCheckerDigit($number);
151
    }
152
153
    /**
154
     * Voter does not has a specific format.
155
     *
156
     * @return string Returns only numbers.
157
     */
158 41
    public function format()
159
    {
160 41
        return preg_replace($this->state->getRegex(), $this->state->getFormat(), "{$this}");
161
    }
162
163
    /**
164
     * {@inheritdoc}
165
     */
166 410
    public function calculateDigit($baseNumber)
167
    {
168 410
        $digit = $this->state->calculateDigit($baseNumber);
169
170 410
        return "{$digit}";
171
    }
172
}
173