<?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;

trait Exporter
{
    abstract public function export($json);

    public function jsonEncode($data)
    {
        return json_encode($data);
    }

    /**
     * Create and export a json-encoded event.
     *
     * @see \predictionio\EventClient::CreateEvent()
     *
     * @param $event
     * @param $entityType
     * @param $entityId
     * @param null $targetEntityType
     * @param null $targetEntityId
     * @param array $properties
     * @param $eventTime
     */
    public function createEvent(
        $event,
        $entityType,
        $entityId,
        $targetEntityType=null,
        $targetEntityId=null,
        array $properties=null,
        $eventTime=null
    ) {
        if (!isset($eventTime)) {
            $eventTime = new \DateTime();
        } elseif (!($eventTime instanceof \DateTime)) {
            $eventTime = new \DateTime($eventTime);
        }
        $eventTime = $eventTime->format(\DateTime::ISO8601);

        $data = [
            'event' => $event,
            'entityType' => $entityType,
            'entityId' => $entityId,
            'eventTime' => $eventTime,
        ];

        if (isset($targetEntityType)) {
            $data['targetEntityType'] = $targetEntityType;
        }

        if (isset($targetEntityId)) {
            $data['targetEntityId'] = $targetEntityId;
        }

        if (isset($properties)) {
            $data['properties'] = $properties;
        }

        $json = $this->jsonEncode($data);

        $this->export($json);
    }
}
