<?php
namespace Opentalent\OtTemplating\Domain\Model;

use TYPO3\CMS\Extbase\DomainObject\AbstractEntity;

/**
 * Event
 */
class Event extends AbstractEntity
{
    /**
     * id
     *
     * @var int
     */
    protected $id = 0;

    /**
     * type
     *
     * @var string
     */
    protected $type = '';

    /**
     * organizationId
     *
     * @var int
     */
    protected $organizationId = 0;

    /**
     * subdomain
     *
     * @var string
     */
    protected $subdomain = '';

    /**
     * name
     *
     * @var string
     */
    protected $name = '';

    /**
     * description
     *
     * @var string
     */
    protected $description = '';

    /**
     * categories
     *
     * @var int
     */
    protected $categories = 0;

    /**
     * url
     *
     * @var string
     */
    protected $url = '';

    /**
     * rule
     *
     * @var string
     */
    protected $rule = '';

    /**
     * datetimeStart
     *
     * @var \DateTime
     */
    protected $datetimeStart = null;

    /**
     * datetimeEnd
     *
     * @var \DateTime
     */
    protected $datetimeEnd = null;

    /**
     * dates
     *
     * @var string
     */
    protected $dates = '';

    /**
     * placename
     *
     * @var string
     */
    protected $placename = '';

    /**
     * placeDescription
     *
     * @var string
     */
    protected $placeDescription = '';

    /**
     * placeFloorSize
     *
     * @var string
     */
    protected $placeFloorSize = '';

    /**
     * placeCapacity
     *
     * @var string
     */
    protected $placeCapacity = '';

    /**
     * city
     *
     * @var string
     */
    protected $city = '';

    /**
     * postalCode
     *
     * @var string
     */
    protected $postalCode = '';

    /**
     * streetAddress
     *
     * @var string
     */
    protected $streetAddress = '';

    /**
     * longitude
     *
     * @var float
     */
    protected $longitude = 0.0;

    /**
     * latitude
     *
     * @var float
     */
    protected $latitude = 0.0;

    /**
     * roomName
     *
     * @var string
     */
    protected $roomName = '';

    /**
     * roomDescription
     *
     * @var string
     */
    protected $roomDescription = '';

    /**
     * roomLocalisation
     *
     * @var string
     */
    protected $roomLocalisation = '';

    /**
     * roomCapacity
     *
     * @var string
     */
    protected $roomCapacity = '';

    /**
     * roomFloorSize
     *
     * @var string
     */
    protected $roomFloorSize = '';

    /**
     * zupId
     *
     * @var int
     */
    protected $zupId = 0;

    /**
     * deepLink
     *
     * @var string
     */
    protected $deepLink = '';

    /**
     * image
     *
     * @var string
     */
    protected $image = '';

    /**
     * priceMini
     *
     * @var float
     */
    protected $priceMini = 0.0;

    /**
     * meetingSchedule
     *
     * @var string
     */
    protected $meetingSchedule = '';

    /**
     * api
     *
     * @var bool
     */
    protected $api = false;

    /**
     * parentName
     *
     * @var string
     */
    protected $parentName = '';

    /**
     * parentSubdomain
     *
     * @var string
     */
    protected $parentSubdomain = '';

    /**
     * organization
     *
     * @var
     */
    protected $organization = null;

    /**
     * Returns the id
     *
     * @return int $id
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Sets the id
     *
     * @param int $id
     * @return void
     */
    public function setId($id)
    {
        $this->id = $id;
    }

    /**
     * Returns the type
     *
     * @return string $type
     */
    public function getType()
    {
        return $this->type;
    }

    /**
     * Sets the type
     *
     * @param string $type
     * @return void
     */
    public function setType($type)
    {
        $this->type = $type;
    }

    /**
     * Returns the organizationId
     *
     * @return int $organizationId
     */
    public function getOrganizationId()
    {
        return $this->organizationId;
    }

    /**
     * Sets the organizationId
     *
     * @param int $organizationId
     * @return void
     */
    public function setOrganizationId($organizationId)
    {
        $this->organizationId = $organizationId;
    }

    /**
     * Returns the subdomain
     *
     * @return string $subdomain
     */
    public function getSubdomain()
    {
        return $this->subdomain;
    }

    /**
     * Sets the subdomain
     *
     * @param string $subdomain
     * @return void
     */
    public function setSubdomain($subdomain)
    {
        $this->subdomain = $subdomain;
    }

    /**
     * Returns the name
     *
     * @return string $name
     */
    public function getName()
    {
        return $this->name;
    }

    /**
     * Sets the name
     *
     * @param string $name
     * @return void
     */
    public function setName($name)
    {
        $this->name = $name;
    }

    /**
     * Returns the description
     *
     * @return string $description
     */
    public function getDescription()
    {
        return $this->description;
    }

    /**
     * Sets the description
     *
     * @param string $description
     * @return void
     */
    public function setDescription($description)
    {
        $this->description = $description;
    }

    /**
     * Returns the categories
     *
     * @return int $categories
     */
    public function getCategories()
    {
        return $this->categories;
    }

    /**
     * Sets the categories
     *
     * @param int $categories
     * @return void
     */
    public function setCategories($categories)
    {
        $this->categories = $categories;
    }

    /**
     * Returns the url
     *
     * @return string $url
     */
    public function getUrl()
    {
        return $this->url;
    }

    /**
     * Sets the url
     *
     * @param string $url
     * @return void
     */
    public function setUrl($url)
    {
        $this->url = $url;
    }

    /**
     * Returns the rule
     *
     * @return string $rule
     */
    public function getRule()
    {
        return $this->rule;
    }

    /**
     * Sets the rule
     *
     * @param string $rule
     * @return void
     */
    public function setRule($rule)
    {
        $this->rule = $rule;
    }

    /**
     * Returns the datetimeStart
     *
     * @return \DateTime $datetimeStart
     */
    public function getDatetimeStart()
    {
        return $this->datetimeStart;
    }

    /**
     * Sets the datetimeStart
     *
     * @param \DateTime $datetimeStart
     * @return void
     */
    public function setDatetimeStart(\DateTime $datetimeStart)
    {
        $this->datetimeStart = $datetimeStart;
    }

    /**
     * Returns the datetimeEnd
     *
     * @return \DateTime $datetimeEnd
     */
    public function getDatetimeEnd()
    {
        return $this->datetimeEnd;
    }

    /**
     * Sets the datetimeEnd
     *
     * @param \DateTime $datetimeEnd
     * @return void
     */
    public function setDatetimeEnd(\DateTime $datetimeEnd)
    {
        $this->datetimeEnd = $datetimeEnd;
    }

    /**
     * Returns the dates
     *
     * @return string $dates
     */
    public function getDates()
    {
        return $this->dates;
    }

    /**
     * Sets the dates
     *
     * @param string $dates
     * @return void
     */
    public function setDates($dates)
    {
        $this->dates = $dates;
    }

    /**
     * Returns the placename
     *
     * @return string $placename
     */
    public function getPlacename()
    {
        return $this->placename;
    }

    /**
     * Sets the placename
     *
     * @param string $placename
     * @return void
     */
    public function setPlacename($placename)
    {
        $this->placename = $placename;
    }

    /**
     * Returns the placeDescription
     *
     * @return string $placeDescription
     */
    public function getPlaceDescription()
    {
        return $this->placeDescription;
    }

    /**
     * Sets the placeDescription
     *
     * @param string $placeDescription
     * @return void
     */
    public function setPlaceDescription($placeDescription)
    {
        $this->placeDescription = $placeDescription;
    }

    /**
     * Returns the placeFloorSize
     *
     * @return string $placeFloorSize
     */
    public function getPlaceFloorSize()
    {
        return $this->placeFloorSize;
    }

    /**
     * Sets the placeFloorSize
     *
     * @param string $placeFloorSize
     * @return void
     */
    public function setPlaceFloorSize($placeFloorSize)
    {
        $this->placeFloorSize = $placeFloorSize;
    }

    /**
     * Returns the placeCapacity
     *
     * @return string $placeCapacity
     */
    public function getPlaceCapacity()
    {
        return $this->placeCapacity;
    }

    /**
     * Sets the placeCapacity
     *
     * @param string $placeCapacity
     * @return void
     */
    public function setPlaceCapacity($placeCapacity)
    {
        $this->placeCapacity = $placeCapacity;
    }

    /**
     * Returns the city
     *
     * @return string $city
     */
    public function getCity()
    {
        return $this->city;
    }

    /**
     * Sets the city
     *
     * @param string $city
     * @return void
     */
    public function setCity($city)
    {
        $this->city = $city;
    }

    /**
     * Returns the postalCode
     *
     * @return string $postalCode
     */
    public function getPostalCode()
    {
        return $this->postalCode;
    }

    /**
     * Sets the postalCode
     *
     * @param string $postalCode
     * @return void
     */
    public function setPostalCode($postalCode)
    {
        $this->postalCode = $postalCode;
    }

    /**
     * Returns the streetAddress
     *
     * @return string $streetAddress
     */
    public function getStreetAddress()
    {
        return $this->streetAddress;
    }

    /**
     * Sets the streetAddress
     *
     * @param string $streetAddress
     * @return void
     */
    public function setStreetAddress($streetAddress)
    {
        $this->streetAddress = $streetAddress;
    }

    /**
     * Returns the longitude
     *
     * @return float $longitude
     */
    public function getLongitude()
    {
        return $this->longitude;
    }

    /**
     * Sets the longitude
     *
     * @param float $longitude
     * @return void
     */
    public function setLongitude($longitude)
    {
        $this->longitude = $longitude;
    }

    /**
     * Returns the latitude
     *
     * @return float $latitude
     */
    public function getLatitude()
    {
        return $this->latitude;
    }

    /**
     * Sets the latitude
     *
     * @param float $latitude
     * @return void
     */
    public function setLatitude($latitude)
    {
        $this->latitude = $latitude;
    }

    /**
     * Returns the roomName
     *
     * @return string $roomName
     */
    public function getRoomName()
    {
        return $this->roomName;
    }

    /**
     * Sets the roomName
     *
     * @param string $roomName
     * @return void
     */
    public function setRoomName($roomName)
    {
        $this->roomName = $roomName;
    }

    /**
     * Returns the roomDescription
     *
     * @return string $roomDescription
     */
    public function getRoomDescription()
    {
        return $this->roomDescription;
    }

    /**
     * Sets the roomDescription
     *
     * @param string $roomDescription
     * @return void
     */
    public function setRoomDescription($roomDescription)
    {
        $this->roomDescription = $roomDescription;
    }

    /**
     * Returns the roomLocalisation
     *
     * @return string $roomLocalisation
     */
    public function getRoomLocalisation()
    {
        return $this->roomLocalisation;
    }

    /**
     * Sets the roomLocalisation
     *
     * @param string $roomLocalisation
     * @return void
     */
    public function setRoomLocalisation($roomLocalisation)
    {
        $this->roomLocalisation = $roomLocalisation;
    }

    /**
     * Returns the roomCapacity
     *
     * @return string $roomCapacity
     */
    public function getRoomCapacity()
    {
        return $this->roomCapacity;
    }

    /**
     * Sets the roomCapacity
     *
     * @param string $roomCapacity
     * @return void
     */
    public function setRoomCapacity($roomCapacity)
    {
        $this->roomCapacity = $roomCapacity;
    }

    /**
     * Returns the roomFloorSize
     *
     * @return string $roomFloorSize
     */
    public function getRoomFloorSize()
    {
        return $this->roomFloorSize;
    }

    /**
     * Sets the roomFloorSize
     *
     * @param string $roomFloorSize
     * @return void
     */
    public function setRoomFloorSize($roomFloorSize)
    {
        $this->roomFloorSize = $roomFloorSize;
    }

    /**
     * Returns the zupId
     *
     * @return int $zupId
     */
    public function getZupId()
    {
        return $this->zupId;
    }

    /**
     * Sets the zupId
     *
     * @param int $zupId
     * @return void
     */
    public function setZupId($zupId)
    {
        $this->zupId = $zupId;
    }

    /**
     * Returns the deepLink
     *
     * @return string $deepLink
     */
    public function getDeepLink()
    {
        return $this->deepLink;
    }

    /**
     * Sets the deepLink
     *
     * @param string $deepLink
     * @return void
     */
    public function setDeepLink($deepLink)
    {
        $this->deepLink = $deepLink;
    }

    /**
     * Returns the image
     *
     * @return string $image
     */
    public function getImage()
    {
        return $this->image;
    }

    /**
     * Sets the image
     *
     * @param string $image
     * @return void
     */
    public function setImage($image)
    {
        $this->image = $image;
    }

    /**
     * Returns the priceMini
     *
     * @return float $priceMini
     */
    public function getPriceMini()
    {
        return $this->priceMini;
    }

    /**
     * Sets the priceMini
     *
     * @param float $priceMini
     * @return void
     */
    public function setPriceMini($priceMini)
    {
        $this->priceMini = $priceMini;
    }

    /**
     * Returns the meetingSchedule
     *
     * @return string $meetingSchedule
     */
    public function getMeetingSchedule()
    {
        return $this->meetingSchedule;
    }

    /**
     * Sets the meetingSchedule
     *
     * @param string $meetingSchedule
     * @return void
     */
    public function setMeetingSchedule($meetingSchedule)
    {
        $this->meetingSchedule = $meetingSchedule;
    }

    /**
     * Returns the api
     *
     * @return bool $api
     */
    public function getApi()
    {
        return $this->api;
    }

    /**
     * Sets the api
     *
     * @param bool $api
     * @return void
     */
    public function setApi($api)
    {
        $this->api = $api;
    }

    /**
     * Returns the boolean state of api
     *
     * @return bool
     */
    public function isApi()
    {
        return $this->api;
    }

    /**
     * Returns the parentName
     *
     * @return string $parentName
     */
    public function getParentName()
    {
        return $this->parentName;
    }

    /**
     * Sets the parentName
     *
     * @param string $parentName
     * @return void
     */
    public function setParentName($parentName)
    {
        $this->parentName = $parentName;
    }

    /**
     * Returns the parentSubdomain
     *
     * @return string $parentSubdomain
     */
    public function getParentSubdomain()
    {
        return $this->parentSubdomain;
    }

    /**
     * Sets the parentSubdomain
     *
     * @param string $parentSubdomain
     * @return void
     */
    public function setParentSubdomain($parentSubdomain)
    {
        $this->parentSubdomain = $parentSubdomain;
    }

    /**
     * Returns the organization
     *
     * @return  $organization
     */
    public function getOrganization()
    {
        return $this->organization;
    }

    /**
     * Sets the organization
     *
     * @param string $organization
     * @return void
     */
    public function setOrganization($organization)
    {
        $this->organization = $organization;
    }


    /**
     *  Retourne une chaine formattée indiquant la date et l'heure de début et de fin de l'Event
     *
     * @return string
     */
    public function getFormattedDates() {
        if ($this->getDatetimeStart() & $this->getDatetimeEnd()) {
            if ($this->getDatetimeStart()->format('d-m-Y') != $this->getDatetimeEnd()->format('d-m-Y')) {
                return 'Du ' . $this->getDatetimeStart()->format('d/m/Y H\hi') . ' au ' . $this->getDatetimeEnd()->format('d/m/Y H\hi');
            } else {
                return 'Le ' . $this->getDatetimeStart()->format('d/m/Y') . ' de ' . $this->getDatetimeStart()->format('H\hi') . ' à ' . $this->getDatetimeEnd()->format('H\hi');
            }
        } else if ($this->getDatetimeStart()) {
            return 'A partir de ' . $this->getDatetimeStart()->format('d/m/Y H\hi');
        } else if ($this->getDatetimeEnd()) {
            return "Jusqu'à " . $this->getDatetimeEnd()->format('d/m/Y H\hi');
        }
        return '';
    }


    /**
     * Returns the short concatened location and date of the event
     *
     * @return string $datetimeStart
     */
    public function getLocAndDate() {
        $infos = [];

        if ($this->getPlacename() && $this->getCity() && ($this->getPlacename() !== $this->getCity())) {
            $infos[] = $this->getPlacename() . ' (' . $this->getCity() . ')';
        } else if ($this->getPlacename()) {
            $infos[] = $this->getPlacename();
        } else if ($this->getPlacename()) {
            $infos[] = $this->getCity();
        }
        $dates = $this->getFormattedDates();
        if ($dates !== '') {
            $infos[] = lcfirst($dates);
        }
        return ucfirst(join(', ', $infos));
    }


    /**
     * Returns the concateneted adress of the event
     *
     * @return string
     */
    public function getFullAdress() {
        $adress = [];

        if ($this->getPlaceName() &&
            strtolower($this->getPlaceName()) != strtolower($this->getStreetAddress()) &&
            strtolower($this->getPlaceName()) != strtolower($this->getCity())) {
            // On ajoute le nom du lieu, si ce n'est pas celui de la ville ou d'une adresse telle qu'une place
            $adress[] = $this->getPlaceName();
        }
        if ($this->getRoomName() !== null) {
            $adress[] = $this->getRoomName();
        }
        if ($this->getRoomLocalisation() !== null) {
            $adress[] = $this->getRoomLocalisation();
        }

        if ($this->getStreetAddress() !== null) {
            $adress[] = $this->getStreetAddress();
        }

        if ($this->getCity() !== null) {
            $pc = '';
            if ($this->getPostalCode() !== null) {
                $pc = $this->getPostalCode() . ' ';
            }
            $adress[] = $pc . $this->getCity();
        }
        return ucfirst(join(PHP_EOL, $adress));
    }

    /**
     * Returns an array containing all the data to display
     *
     * @return array
     */
    public function getInfosTable() {
        $infos = [];
        if ($this->getPlacename() !== null) {
            $infos['Lieu'] = $this->getPlacename();
        }

        if ($this->getPlacename() !== null) {
            $infos['Lieu'] = $this->getPlacename();
        }
        if ($this->getPlaceDescription() !== null) {
            $infos['Description du lieu'] = $this->getPlaceDescription();
        }

        $adress = $this->getFullAdress();
        if ($adress !== '') {
            $infos['Adresse'] = $adress;
        }

        if ($this->getUrl() !== null) {
            $infos['Lien externe'] = $this->getUrl();
        }
        return $infos;
    }

    /**
     * Returns an eluded description (max 100cars)
     *
     * @return string
     */
    public function getShortDescription() {
        $maxCars = 100;
        if (strlen($this->getDescription()) <= $maxCars) {
            return $this->getDescription();
        } else {
            return mb_substr($this->getDescription(), 0, $maxCars, "UTF-8") . '...';
        }
    }

}
