1<?php
2
3namespace MusicBrainz;
4
5/**
6 * Represents a MusicBrainz release object
7 * @package MusicBrainz
8 */
9class Release
10{
11    /**
12     * @var string
13     */
14    public $id;
15    /**
16     * @var string
17     */
18    public $title;
19    /**
20     * @var string
21     */
22    public $status;
23    /**
24     * @var string
25     */
26    public $quality;
27    /**
28     * @var string
29     */
30    public $language;
31    /**
32     * @var string
33     */
34    public $script;
35    /**
36     * @var string
37     */
38    public $date;
39    /**
40     * @var string
41     */
42    public $country;
43    /**
44     * @var string
45     */
46    public $barcode;
47    /**
48     * @var Artist[]
49     */
50    public $artists = array();
51    /**
52     * @var
53     */
54    protected $releaseDate;
55    /**
56     * @var array
57     */
58    private $data;
59
60    /**
61     * @param array       $release
62     * @param MusicBrainz $brainz
63     */
64    public function __construct(array $release, MusicBrainz $brainz)
65    {
66        $this->data   = $release;
67        $this->brainz = $brainz;
68
69        $this->id       = isset($release['id']) ? (string)$release['id'] : '';
70        $this->title    = isset($release['title']) ? (string)$release['title'] : '';
71        $this->status   = isset($release['status']) ? (string)$release['status'] : '';
72        $this->quality  = isset($release['quality']) ? (string)$release['quality'] : '';
73        $this->language = isset($release['text-representation']['language']) ? (string)$release['text-representation']['language'] : '';
74        $this->script   = isset($release['text-representation']['script']) ? (string)$release['text-representation']['script'] : '';
75        $this->date     = isset($release['date']) ? (string)$release['date'] : '';
76        $this->country  = isset($release['country']) ? (string)$release['country'] : '';
77        $this->barcode  = isset($release['barcode']) ? (string)$release['barcode'] : '';
78    }
79
80    /**
81     * @return string
82     */
83    public function getId()
84    {
85        return $this->id;
86    }
87
88    /**
89     * Get's the earliest release date
90     * @return \DateTime
91     */
92    public function getReleaseDate()
93    {
94        if (null != $this->releaseDate) {
95            return $this->releaseDate;
96        }
97
98        // If there is no release date set, look through the release events
99        if (!isset($this->data['date']) && isset($this->data['release-events'])) {
100            return $this->getReleaseEventDates($this->data['release-events']);
101        } elseif (isset($this->data['date'])) {
102            return new \DateTime($this->data['date']);
103        }
104
105        return new \DateTime();
106    }
107
108    /**
109     * @param array $releaseEvents
110     *
111     * @return array
112     */
113    public function getReleaseEventDates(array $releaseEvents)
114    {
115
116        $releaseDate = new \DateTime();
117
118        foreach ($releaseEvents as $releaseEvent) {
119            if (isset($releaseEvent['date'])) {
120                $releaseDateTmp = new \DateTime($releaseEvent['date']);
121
122                if ($releaseDateTmp < $releaseDate) {
123                    $releaseDate = $releaseDateTmp;
124                }
125            }
126        }
127
128        return $releaseDate;
129    }
130}
131