<?php

namespace Xentral\Modules\DocuvitaApi;

use Xentral\Modules\DocuvitaApi\Exception\UnsupportedFileTypeException;

/**
 * @property string       OBJ_MAILTO
 * @property string       OBJ_VOUCHERDATE
 * @property string       OBJ_VOUCHERNUMBER
 * @property string       OBJ_PARENTOBJECT
 * @property bool|string  OBJ_NAME
 * @property false|string OBJ_DATECREATED
 * @property int          OBJ_OBJECTTYPE
 */
class DocuvitaObject
{
    /** @var array PROPERTYTYPES */
    const PROPERTYTYPES = [
        'S' => 'FieldValueString',
        'N' => 'FieldValueNumeric',
        'D' => 'FieldValueDateTime',
    ];

    /** @var mixed $originalObject */
    private $originalObject;

    /**
     * @param array  $originalObject
     * @param string $sessionGUID
     */
    public function __construct($originalObject, $sessionGUID)
    {
        $this->originalObject = $originalObject;
        $this->originalObject->SessionGuid = $sessionGUID;
        $this->setVersionOriginalFilename('');
    }

    /**
     * @param string $propertyName
     * @param string $propertyValue
     *
     * @throws UnsupportedFileTypeException
     *
     * @return void
     */
    public function __set($propertyName, $propertyValue)
    {
        foreach ($this->originalObject->ObjectPropertyList as $property) {
            if ($property->FieldName === $propertyName) {
                $propertyValueFieldName = self::PROPERTYTYPES[$property->FieldType];
                if (!isset($propertyValueFieldName)) {
                    throw new UnsupportedFileTypeException(sprintf(
                        'Field type "%s" not supported',
                        $property->FieldType
                    ));
                }
                $property->$propertyValueFieldName = $propertyValue;

                return;
            }
        }
    }

    /**
     * @param $propertyName
     *
     * @throws UnsupportedFileTypeException
     *
     * @return string|null
     */
    public function __get($propertyName)
    {
        foreach ($this->originalObject->ObjectPropertyList as $property) {
            if ($property->FieldName === $propertyName) {
                $propertyValueFieldName = self::PROPERTYTYPES[$property->FieldType];
                if (!isset($propertyValueFieldName)) {
                    throw new UnsupportedFileTypeException(sprintf(
                        'Field type "%s" not supported',
                        $property->FieldType
                    ));
                }

                return $property->$propertyValueFieldName;
            }
        }

        return null;
    }

    /**
     * @param string $propertyName
     *
     * @return bool
     */
    public function __isset($propertyName)
    {
        return $this->$propertyName !== null;
    }

    /**
     * @return string
     */
    public function getDocUploadGuid()
    {
        return $this->originalObject->DocUploadGuid;
    }

    /**
     * @param string $sessionGuid
     *
     * @return void
     */
    public function setSessionGuid($sessionGuid)
    {
        $this->originalObject->SessionGuid = $sessionGuid;
    }

    /**
     * @param string $fileName
     *
     * @return void
     */
    public function setVersionOriginalFilename($fileName)
    {
        $this->originalObject->VersionOriginalFilename = $fileName;
    }

    /**
     * @returns string
     */
    public function getVersionOriginalFilename()
    {
        return $this->originalObject->VersionOriginalFilename;
    }

    /**
     * @return false|string
     */
    public function toJSON()
    {
        return json_encode($this->originalObject);
    }
}