summaryrefslogtreecommitdiff
path: root/src/Model/Vendor.php
blob: 6b9870437a9867fddee79de0fc4611125c2f87a9 (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
<?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
 */
class Vendor extends Model
{
    protected $name;
    protected $postcode;
    protected $maxCovers;
    protected $menus;

    public function __construct($name, $postcode, $maxCovers)
    {
        $this->name = $name;
        $this->postcode = $postcode;
        $this->maxCovers = $maxCovers;
        $this->menus = [];
    }

    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;
    }

    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;
    }

    public function checkDate(DateTime $date)
    {
        $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;
    }

    public function checkLocation(string $location)
    {
        $postPrefix = '';

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

            $postPrefix .= $char;
        }

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

    public function checkMaxCovers(int $covers)
    {
        if ($this->maxCovers >= $covers) {
            return true;
        }

        return false;
    }

    public function toString()
    {
        $out = [
            $this->name . ';' . $this->postcode . ';' . $this->maxCovers
        ];

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

        return $out;
    }
}