Completed
Push — master ( 877236...2dc251 )
by ARCANEDEV
05:46
created

Comparator::getDeleted()   B

Complexity

Conditions 4
Paths 4

Size

Total Lines 24
Code Lines 13

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 16
CRAP Score 4

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 24
ccs 16
cts 16
cp 1
rs 8.6846
cc 4
eloc 13
nc 4
nop 0
crap 4
1
<?php namespace Arcanesoft\Settings\Helpers;
2
3
use Arcanedev\Support\Collection;
4
5
/**
6
 * Class     Comparator
7
 *
8
 * @package  Arcanesoft\Settings\Helpers
9
 * @author   ARCANEDEV <[email protected]>
10
 */
11
class Comparator
12
{
13
    /* ------------------------------------------------------------------------------------------------
14
     |  Properties
15
     | ------------------------------------------------------------------------------------------------
16
     */
17
    /**
18
     * Unsaved data.
19
     *
20
     * @var \Arcanedev\Support\Collection
21
     */
22
    private $unsaved;
23
24
    /**
25
     * Saved data.
26
     *
27
     * @var \Arcanedev\Support\Collection
28
     */
29
    private $saved;
30
31
    /* ------------------------------------------------------------------------------------------------
32
     |  Constructor
33
     | ------------------------------------------------------------------------------------------------
34
     */
35
    /**
36
     * Comparator constructor.
37
     *
38
     * @param  array  $unsaved
39
     * @param  array  $saved
40
     */
41 28
    public function __construct(array $unsaved, array $saved)
42
    {
43 28
        $this->unsaved = Collection::make($unsaved);
44 28
        $this->saved   = Collection::make($saved);
45 28
    }
46
47
    /* ------------------------------------------------------------------------------------------------
48
     |  Main Functions
49
     | ------------------------------------------------------------------------------------------------
50
     */
51
    /**
52
     * Make the Comparator instance.
53
     *
54
     * @param  array  $unsaved
55
     * @param  array  $saved
56
     *
57
     * @return self
58
     */
59 28
    public static function make(array $unsaved, array $saved)
60
    {
61 28
        return new self($unsaved, $saved);
62
    }
63
64
    /**
65
     * Compare the changes.
66
     *
67
     * @param  array  $unsaved
68
     * @param  array  $saved
69
     *
70
     * @return array
71
     */
72 28
    public static function compare(array $unsaved, array $saved)
73
    {
74 28
        return self::make($unsaved, $saved)->compareChanges();
75
    }
76
77
    /**
78
     * Compare the changes.
79
     *
80
     * @return array
81
     */
82 28
    private function compareChanges()
83
    {
84 28
        $inserted = $updated = [];
85
86 28
        foreach ($this->unsaved as $domain => $values) {
87 24
            foreach ($values as $key => $value) {
88 24
                if ($this->isSaved($domain, $key)) {
89 8
                    if ($this->isUpdated($domain, $key, $value)) {
90 5
                        $updated[$domain][$key] = $value; // Updated
91 3
                    }
92 6
                }
93
                else {
94 24
                    $inserted[$domain][$key] = $value; // Inserted
95
                }
96 18
            }
97 21
        }
98
99 28
        $deleted = $this->getDeleted();
100
101 28
        return compact('inserted', 'updated', 'deleted');
102
    }
103
104
    /**
105
     * Compare the deleted entries.
106
     *
107
     * @return array
108
     */
109 28
    private function getDeleted()
110
    {
111 28
        if ($this->unsaved->isEmpty()) {
112
            // Delete all saved settings.
113 16
            return $this->saved->map(function (array $settings) {
114 12
                return array_keys($settings);
115 16
            })->toArray();
116
        }
117
118 24
        $deleted = [];
119
120 24
        foreach ($this->unsaved as $domain => $values) {
121 24
            $diff = array_diff(
122 24
                array_keys($this->saved->get($domain, [])),
123 18
                array_keys($values)
124 18
            );
125
126 24
            if ( ! empty($diff)) {
127 9
                $deleted[$domain] = $diff;
128 3
            }
129 18
        }
130
131 24
        return $deleted;
132
    }
133
134
    /**
135
     * Check if the entry is saved.
136
     *
137
     * @param  string  $domain
138
     * @param  string  $key
139
     *
140
     * @return bool
141
     */
142 24
    private function isSaved($domain, $key)
143
    {
144 24
        return Arr::has($this->saved->get($domain, []), $key);
145
    }
146
147
    /**
148
     * Check if the entry is updated.
149
     *
150
     * @param  string  $domain
151
     * @param  string  $key
152
     * @param  mixed   $value
153
     *
154
     * @return bool
155
     */
156 8
    private function isUpdated($domain, $key, $value)
157
    {
158 8
        return array_get($this->saved->get($domain, []), $key) !== $value;
159
    }
160
}
161