<?php

declare(strict_types=1);

namespace Xentral\Modules\FiskalyApi\Data\CashPointClosing;

class CashPointClosingTransaction
{
    /** @var TransactionHead $head */
    private $head;

    /** @var TransactionData $data */
    private $data;

    /** @var TransactionSecurity $security */
    private $security;

    /**
     * CashPointClosingTransaction constructor.
     *
     * @param TransactionHead     $head
     * @param TransactionData     $data
     * @param TransactionSecurity $security
     */
    public function __construct(TransactionHead $head, TransactionData $data, TransactionSecurity $security)
    {
        $this->setHead($head);
        $this->setData($data);
        $this->setSecurity($security);
    }

    /**
     * @param $apiResult
     *
     * @return static
     */
    public static function fromApiResult(object $apiResult): self
    {
        return new self(
            TransactionHead::fromApiResult($apiResult->head),
            TransactionData::fromApiResult($apiResult->data),
            TransactionSecurity::fromApiResult($apiResult->security)
        );
    }

    /**
     * @param array $dbState
     *
     * @return static
     */
    public static function fromDbState(array $dbState): self
    {
        return new self(
            TransactionHead::fromDbState($dbState['head']),
            TransactionData::fromDbState($dbState['data']),
            TransactionSecurity::fromDbState($dbState['security'])
        );
    }

    /**
     * @return array
     */
    public function toArray(): array
    {
        return [
            'head'     => $this->getHead()->toArray(),
            'data'     => $this->getData()->toArray(),
            'security' => $this->getSecurity()->toArray(),
        ];
    }

    /**
     * @return TransactionHead
     */
    public function getHead(): TransactionHead
    {
        return TransactionHead::fromDbState($this->head->toArray());
    }

    /**
     * @param TransactionHead $head
     */
    public function setHead(TransactionHead $head): void
    {
        $this->head = TransactionHead::fromDbState($head->toArray());
    }

    /**
     * @return TransactionData
     */
    public function getData(): TransactionData
    {
        return TransactionData::fromDbState($this->data->toArray());
    }

    /**
     * @param TransactionData $data
     */
    public function setData(TransactionData $data): void
    {
        $this->data = TransactionData::fromDbState($data->toArray());
    }

    /**
     * @return TransactionSecurity
     */
    public function getSecurity(): TransactionSecurity
    {
        return TransactionSecurity::fromDbState($this->security->toArray());
    }

    /**
     * @param TransactionSecurity $security
     */
    public function setSecurity(TransactionSecurity $security): void
    {
        $this->security = TransactionSecurity::fromDbState($security->toArray());
    }
}