<?php

/**
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *    http://www.apache.org/licenses/LICENSE-2.0
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

namespace predictionio;

use GuzzleHttp\Client;
use \DateTime;

/**
 * Client for connecting to an Event Server
 *
 */
class EventClient extends BaseClient
{
    const DATE_TIME_FORMAT = DateTime::ISO8601;
    private $accessKey;
    private $eventUrl;

    /**
     * @param string Access Key
     * @param string Base URL to the Event Server. Default is localhost:7070.
     * @param float Timeout of the request in seconds. Use 0 to wait indefinitely
     *              Default is 0.
     * @param float Number of seconds to wait while trying to connect to a server.
     *              Default is 5.
     */
    public function __construct(
        $accessKey,
        $baseUrl='http://localhost:7070',
        $timeout=0,
        $connectTimeout=5
    ) {
        parent::__construct($baseUrl, $timeout, $connectTimeout);
        $this->accessKey = $accessKey;
        $this->eventUrl = "/events.json?accessKey=$this->accessKey";
    }

    private function getEventTime($eventTime)
    {
        $result = $eventTime;
        if (!isset($eventTime)) {
            $result = (new DateTime('NOW'))->format(self::DATE_TIME_FORMAT);
        }

        return $result;
    }

    /**
     * Set a user entity
     *
     * @param int|string User Id
     * @param array Properties of the user entity to set
     * @param string Time of the event in ISO 8601 format
     *               (e.g. 2014-09-09T16:17:42.937-08:00).
     *               Default is the current time.
     *
     * @return string JSON response
     *
     * @throws PredictionIOAPIError Request error
     */
    public function setUser($uid, array $properties=array(), $eventTime=null)
    {
        $eventTime = $this->getEventTime($eventTime);

        // casting to object so that an empty array would be represented as {}
        if (empty($properties)) {
            $properties = (object)$properties;
        }

        $json = json_encode([
            'event' => '$set',
            'entityType' => 'user',
            'entityId' => $uid,
            'properties' => $properties,
            'eventTime' => $eventTime,
        ]);

        return $this->sendRequest('POST', $this->eventUrl, $json);
    }

    /**
     * Unset a user entity
     *
     * @param int|string User Id
     * @param array Properties of the user entity to unset
     * @param string Time of the event in ISO 8601 format
     *               (e.g. 2014-09-09T16:17:42.937-08:00).
     *               Default is the current time.
     *
     * @return string JSON response
     *
     * @throws PredictionIOAPIError Request error
     */
    public function unsetUser($uid, array $properties, $eventTime=null)
    {
        $eventTime = $this->getEventTime($eventTime);
        if (empty($properties)) {
            throw new PredictionIOAPIError('Specify at least one property');
        }

        $json = json_encode([
            'event' => '$unset',
            'entityType' => 'user',
            'entityId' => $uid,
            'properties' => $properties,
            'eventTime' => $eventTime,
        ]);

        return $this->sendRequest('POST', $this->eventUrl, $json);
    }

    /**
     * Delete a user entity
     *
     * @param int|string User Id
     * @param string Time of the event in ISO 8601 format
     *               (e.g. 2014-09-09T16:17:42.937-08:00).
     *               Default is the current time.
     *
     * @return string JSON response
     *
     * @throws PredictionIOAPIError Request error
     */
    public function deleteUser($uid, $eventTime=null)
    {
        $eventTime = $this->getEventTime($eventTime);

        $json = json_encode([
            'event' => '$delete',
            'entityType' => 'user',
            'entityId' => $uid,
            'eventTime' => $eventTime,
        ]);

        return $this->sendRequest('POST', $this->eventUrl, $json);
    }

    /**
     * Set an item entity
     *
     * @param int|string Item Id
     * @param array Properties of the item entity to set
     * @param string Time of the event in ISO 8601 format
     *               (e.g. 2014-09-09T16:17:42.937-08:00).
     *               Default is the current time.
     *
     * @return string JSON response
     *
     * @throws PredictionIOAPIError Request error
     */
    public function setItem($iid, array $properties=array(), $eventTime=null)
    {
        $eventTime = $this->getEventTime($eventTime);
        if (empty($properties)) {
            $properties = (object)$properties;
        }
        $json = json_encode([
            'event' => '$set',
            'entityType' => 'item',
            'entityId' => $iid,
            'properties' => $properties,
            'eventTime' => $eventTime,
        ]);

        return $this->sendRequest('POST', $this->eventUrl, $json);
    }

    /**
     * Unset an item entity
     *
     * @param int|string Item Id
     * @param array Properties of the item entity to unset
     * @param string Time of the event in ISO 8601 format
     *               (e.g. 2014-09-09T16:17:42.937-08:00).
     *               Default is the current time.
     *
     * @return string JSON response
     *
     * @throws PredictionIOAPIError Request error
     */
    public function unsetItem($iid, array $properties, $eventTime=null)
    {
        $eventTime = $this->getEventTime($eventTime);
        if (empty($properties)) {
            throw new PredictionIOAPIError('Specify at least one property');
        }
        $json = json_encode([
            'event' => '$unset',
            'entityType' => 'item',
            'entityId' => $iid,
            'properties' => $properties,
            'eventTime' => $eventTime,
        ]);

        return $this->sendRequest('POST', $this->eventUrl, $json);
    }

    /**
     * Delete an item entity
     *
     * @param int|string Item Id
     * @param string Time of the event in ISO 8601 format
     *               (e.g. 2014-09-09T16:17:42.937-08:00).
     *               Default is the current time.
     *
     * @return string JSON response
     *
     * @throws PredictionIOAPIError Request error
     */
    public function deleteItem($iid, $eventTime=null)
    {
        $eventTime = $this->getEventTime($eventTime);

        $json = json_encode([
            'event' => '$delete',
            'entityType' => 'item',
            'entityId' => $iid,
            'eventTime' => $eventTime,
        ]);

        return $this->sendRequest('POST', $this->eventUrl, $json);
    }

    /**
     * Record a user action on an item
     *
     * @param string Event name
     * @param int|string User Id
     * @param int|string Item Id
     * @param array Properties of the event
     * @param string Time of the event in ISO 8601 format
     *               (e.g. 2014-09-09T16:17:42.937-08:00).
     *               Default is the current time.
     *
     * @return string JSON response
     *
     * @throws PredictionIOAPIError Request error
     */
    public function recordUserActionOnItem(
       $event,
       $uid,
       $iid,
       array $properties=array(),
       $eventTime=null
   ) {
        $eventTime = $this->getEventTime($eventTime);
        if (empty($properties)) {
            $properties = (object)$properties;
        }
        $json = json_encode([
            'event' => $event,
            'entityType' => 'user',
            'entityId' => $uid,
            'targetEntityType' => 'item',
            'targetEntityId' => $iid,
            'properties' => $properties,
            'eventTime' => $eventTime,
        ]);

        return $this->sendRequest('POST', $this->eventUrl, $json);
    }

    /**
     * Create an event
     *
     * @param array An array describing the event
     *
     * @return string JSON response
     *
     * @throws PredictionIOAPIError Request error
     */
    public function createEvent(array $data)
    {
        $json = json_encode($data);

        return $this->sendRequest('POST', $this->eventUrl, $json);
    }

    /**
     * Retrieve an event
     *
     * @param string Event ID
     *
     * @return string JSON response
     *
     * @throws PredictionIOAPIError Request error
     */
    public function getEvent($eventId)
    {
        return $this->sendRequest(
            'GET',
            "/events/$eventId.json?accessKey=$this->accessKey",
            ''
        );
    }
}
