<?php

namespace Wcms;

use DateTime;
use DateTimeImmutable;
use DateTimeZone;

class Event extends Dbitem
{
    protected $id;
    protected $date;
    protected $type;
    protected $user;
    protected $target;
    protected $message;
    protected $clap = 0;

    public const EVENT_TYPES = [
        'message',
        'page_add',
        'page_edit',
        'page_delete',
        'media_add',
        'media_delete',
        'font_add'
    ];
    public const EVENT_BASE = ['message'];
    public const EVENT_ART = ['page_add', 'page_edit', 'page_delete'];
    public const EVENT_MEDIA = ['media_add', 'media_delete'];
    public const EVENT_FONT = ['font_add', 'font_delete'];
    public const MESSAGE_MAX_LENGTH = 2 ** 10;

    public const VAR_DATE = ['date'];

    public function __construct($datas)
    {
        $this->hydrate($datas);
    }

    public function stamp()
    {
        $this->date = new DateTimeImmutable("now", timezone_open("Europe/Paris"));
        $this->user = idclean($this->user);
        if (in_array($this->type, self::EVENT_ART)) {
            $this->target = idclean($this->target);
        } elseif ($this->type === 'message') {
            $this->message = htmlspecialchars($this->message);
        }
    }

    public function addclap()
    {
        $this->clap ++;
    }

    // _____________________ G E T __________________________

    public function id()
    {
        return $this->id;
    }

    public function date($type = 'datetime')
    {
        switch ($type) {
            case 'datetime':
                return $this->date;

            case 'string':
                return $this->date->format(DateTime::ISO8601);

            case 'hrdi':
                $now = new DateTimeImmutable("now", timezone_open("Europe/Paris"));
                return hrdi($this->date->diff($now));
        }
    }

    public function type()
    {
        return $this->type;
    }

    public function user()
    {
        return $this->user;
    }

    public function target()
    {
        return $this->target;
    }

    public function message()
    {
        return $this->message;
    }

    public function clap()
    {
        return $this->clap;
    }



    // ________________________ S E T ____________________

    public function setid($id)
    {
        if (is_int($id)) {
            $this->id = $id;
        }
    }

    public function setdate($date)
    {
        if ($date instanceof DateTimeImmutable) {
            $this->date = $date;
        } elseif (is_string($date)) {
            $this->date = DateTimeImmutable::createFromFormat(
                DateTime::ISO8601,
                $date,
                new DateTimeZone('Europe/Paris')
            );
        }
    }

    public function settype($type)
    {
        if (in_array($type, self::EVENT_TYPES)) {
            $this->type = $type;
        }
    }

    public function setuser($user)
    {
        if (is_string($user) && strlen($user) < Model::MAX_ID_LENGTH) {
            $this->user = $user;
        }
    }

    public function settarget($target)
    {
        if (is_string($target) && strlen($target) < Model::MAX_ID_LENGTH) {
            $this->target = $target;
        }
    }

    public function setmessage($message)
    {
        if (is_string($message) && strlen($message) < self::MESSAGE_MAX_LENGTH) {
            $this->message = $message;
        }
    }

    public function setclap($clap)
    {
        if (is_int($clap)) {
            $this->clap = $clap;
        }
    }
}