summaryrefslogtreecommitdiff
path: root/src/Model/Vendor.php
blob: dfed157369d794373ef7672441d835d984882c86 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
<?php

namespace App\Model;

use App\File\Handler as FileHandler;
use App\Model\Collection;
use App\Model\Menu;
use App\Model\Model;
use DateTime;
use DateInterval;

/**
 * Vendor Model
 *
 * @author Phil Burton <phil@pgburton.com>
 */
class Vendor extends Model
{
    /**
     * Name of vendor
     *
     * @var string
     */
    protected $name;

    /**
     * Vendor postcode
     *
     * @var string
     */
    protected $postcode;

    /**
     * Max no of people this vendor can cover
     *
     * @var int
     */
    protected $maxCovers;

    /**
     * The array of menus this vendor provides
     *
     * @var Menu[]
     */
    protected $menus;

    /**
     * Load all the vendor data from a given file
     *
     * @author Phil Burton <phil@pgburton.com>
     * @param string $filename
     * @return Collection
     */
    public static function loadAll(string $filename): Collection
    {
        $fileHandler = new FileHandler($filename);

        $fileContents = $fileHandler->getFileContents();

        return static::parseVendors($fileContents);
    }


    /**
     * Parse file and return array
     *
     * @author Phil Burton <phil@pgburton.com>
     * @return array
     */
    public static function parseVendors($fileContents): Collection
    {
        $collection = new Collection;

        // split the various vendor data out
        $array = explode("\n\n", $fileContents);

        // For each vendor
        foreach ($array as $value) {
            $rawVendor = explode("\n", $value);
            // Split off the vendor data
            $vendorHead = explode(";", $rawVendor[0]);

            $vendor = new Vendor($vendorHead[0], $vendorHead[1], $vendorHead[2]);

            // Remove the head
            unset($rawVendor[0]);
            // Reset the keys
            $rawVendor = array_values($rawVendor);

            // Now parse menus
            foreach ($rawVendor as $item) {
                // Ignore empty line (usually last line of file)
                if ($item === "") {
                    continue;
                }
                $rawMenu = explode(";", $item);
                $menu = new Menu($rawMenu[0], $rawMenu[1], $rawMenu[2]);
                $vendor->addMenu($menu);
            }

            $collection[] = $vendor;
        }

        return $collection;
    }

    /**
     * Set vendor data and intiate empty menus array
     *
     * @author Phil Burton <phil@pgburton.com>
     * @param $name
     * @param $postcode
     * @param $maxCovers
     */
    public function __construct($name, $postcode, $maxCovers)
    {
        $this->name = $name;
        $this->postcode = $postcode;
        $this->maxCovers = $maxCovers;
        $this->menus = [];
    }

    /**
     * Add a menu to the menus array
     *
     * @author Phil Burton <phil@pgburton.com>
     * @param Menu $menu
     */
    public function addMenu(Menu $menu)
    {
        $this->menus[] = $menu;
    }

    /**
     * Load vendors from file, parse them into a model collection and Return
     *
     * @author Phil Burton <phil@pgburton.com>
     * @param FileHandler $handler
     * @return Collection
     */
    public function loadFromFile(FileHandler $handler): Collection
    {
        // initalise a Vendor Collection
        $collection = new Collection;

        foreach ($handler->getVendorArray() as $vendorRaw) {
            $collection[] =  new Vendor($vendorRaw);
        }

        return $collection;
    }

    /**
     * Filter the menus base on a given date
     * Return true if at least one menu is still valid
     * Otherwose return false
     *
     * @author Phil Burton <phil@pgburton.com>
     * @param DateTime $date
     * @return bool
     */
    public function checkDate(DateTime $date): bool
    {
        $out = [];
        $now = new DateTime();

        foreach ($this->menus as $menu) {
            $earliestDelivery = $now->add(new DateInterval('PT' . $menu->getAdvanceTime() . 'H'));

            if ($earliestDelivery <= $date) {
                $out[] = $menu;
            }
        }

        $this->menus = $out;

        if (!$this->menus) {
            return false;
        }

        return true;
    }

    /**
     * Return true if the first charaters of the given string matche the first characters of the postcode
     *
     * @author Phil Burton <phil@pgburton.com>
     * @param string $location
     * @return bool
     */
    public function checkLocation(string $location): bool
    {
        $postPrefix = '';

        foreach (str_split($this->postcode) as $char) {
            if (is_numeric($char)) {
                break;
            }

            $postPrefix .= $char;
        }

        return strtoupper($postPrefix) === strtoupper($location);
    }

    /**
     * Return true if the given covers int is less or equal to the max covers int this vendor supports
     *
     * @author Phil Burton <phil@pgburton.com>
     * @param int $covers
     * @return bool
     */
    public function checkMaxCovers(int $covers): bool
    {
        if ($this->maxCovers >= $covers) {
            return true;
        }

        return false;
    }

    /**
     * Return a string representation of this vendor
     *
     * @author Phil Burton <phil@pgburton.com>
     * @return string
     */
    public function toString(): string
    {
        $out = [
            $this->name . ';' . $this->postcode . ';' . $this->maxCovers
        ];

        foreach ($this->menus as $menu) {
            $out[] = $menu->toString();
        }

        return implode("\n", $out);
    }
}