1<?php
2
3namespace Sabre\VObject\Property\ICalendar;
4
5use Sabre\VObject\DateTimeParser;
6use Sabre\VObject\Property;
7use Sabre\Xml;
8
9/**
10 * Period property.
11 *
12 * This object represents PERIOD values, as defined here:
13 *
14 * http://tools.ietf.org/html/rfc5545#section-3.8.2.6
15 *
16 * @copyright Copyright (C) fruux GmbH (https://fruux.com/)
17 * @author Evert Pot (http://evertpot.com/)
18 * @license http://sabre.io/license/ Modified BSD License
19 */
20class Period extends Property
21{
22    /**
23     * In case this is a multi-value property. This string will be used as a
24     * delimiter.
25     *
26     * @var string|null
27     */
28    public $delimiter = ',';
29
30    /**
31     * Sets a raw value coming from a mimedir (iCalendar/vCard) file.
32     *
33     * This has been 'unfolded', so only 1 line will be passed. Unescaping is
34     * not yet done, but parameters are not included.
35     *
36     * @param string $val
37     */
38    public function setRawMimeDirValue($val)
39    {
40        $this->setValue(explode($this->delimiter, $val));
41    }
42
43    /**
44     * Returns a raw mime-dir representation of the value.
45     *
46     * @return string
47     */
48    public function getRawMimeDirValue()
49    {
50        return implode($this->delimiter, $this->getParts());
51    }
52
53    /**
54     * Returns the type of value.
55     *
56     * This corresponds to the VALUE= parameter. Every property also has a
57     * 'default' valueType.
58     *
59     * @return string
60     */
61    public function getValueType()
62    {
63        return 'PERIOD';
64    }
65
66    /**
67     * Sets the json value, as it would appear in a jCard or jCal object.
68     *
69     * The value must always be an array.
70     *
71     * @param array $value
72     */
73    public function setJsonValue(array $value)
74    {
75        $value = array_map(
76            function ($item) {
77                return strtr(implode('/', $item), [':' => '', '-' => '']);
78            },
79            $value
80        );
81        parent::setJsonValue($value);
82    }
83
84    /**
85     * Returns the value, in the format it should be encoded for json.
86     *
87     * This method must always return an array.
88     *
89     * @return array
90     */
91    public function getJsonValue()
92    {
93        $return = [];
94        foreach ($this->getParts() as $item) {
95            list($start, $end) = explode('/', $item, 2);
96
97            $start = DateTimeParser::parseDateTime($start);
98
99            // This is a duration value.
100            if ('P' === $end[0]) {
101                $return[] = [
102                    $start->format('Y-m-d\\TH:i:s'),
103                    $end,
104                ];
105            } else {
106                $end = DateTimeParser::parseDateTime($end);
107                $return[] = [
108                    $start->format('Y-m-d\\TH:i:s'),
109                    $end->format('Y-m-d\\TH:i:s'),
110                ];
111            }
112        }
113
114        return $return;
115    }
116
117    /**
118     * This method serializes only the value of a property. This is used to
119     * create xCard or xCal documents.
120     *
121     * @param Xml\Writer $writer XML writer
122     */
123    protected function xmlSerializeValue(Xml\Writer $writer)
124    {
125        $writer->startElement(strtolower($this->getValueType()));
126        $value = $this->getJsonValue();
127        $writer->writeElement('start', $value[0][0]);
128
129        if ('P' === $value[0][1][0]) {
130            $writer->writeElement('duration', $value[0][1]);
131        } else {
132            $writer->writeElement('end', $value[0][1]);
133        }
134
135        $writer->endElement();
136    }
137}
138