<?php

namespace fid\Hydrator;

use fid\Service\DataTransferObject\Order;
use VuFind\RecordDriver\DefaultRecord;
use Zend\Hydrator\AbstractHydrator;

class OrderHydrator extends AbstractHydrator {

    public function extract($object)
    {
        return;
        // TODO: Implement extract() method.
    }

    /**
     * @param array $data
     * @param Order|object $object
     * @return Order|object|void
     */
    public function hydrate(array $data, $object)
    {
        /** @var DefaultRecord $driver */
        $driver = $data['driver'];

        $object->setType($data['type']);
        $object->setUser($data['user']);

        $partialCopy = array_key_exists('subitoPartialCopy', $data) ? $data['subitoPartialCopy'] : null;

        /* Collect needed record data */
        $id = $driver->tryMethod('getUniqueID');
        $title = $driver->tryMethod('getTitle');
        $publicationDetails = $this->toArray( $driver->tryMethod('getPublicationDetails')[0] );
        $authors = $driver->tryMethod('getDeduplicatedAuthors');
        $primaryAuthor = $driver->tryMethod('getPrimaryAuthor');
        $secondaryAuthors = $driver->tryMethod('getSecondaryAuthors');
        $isbn = $driver->tryMethod('getCleanISBN');
        $issn = $driver->tryMethod('getCleanISSN');
        $languages = $driver->tryMethod('getLanguages');
        $price = $driver->tryMethod('getPrice');
        /* pre generated record-url */
        $url = $data['url'];
        /* Collect special journal data used for subito-article*/
        $publishedIn = $driver->tryMethod('getPublishedIn');
        if (isset($publishedIn['issue'])) {
            $publishedIn['issue'] = is_string($publishedIn['issue'])
                ? $publishedIn['issue'] : implode(', ', $publishedIn['issue']);
        }

        $record = compact(
            'id',
            'title',
            'publicationDetails',
            'authors',
            'primaryAuthor',
            'secondaryAuthors',
            'issn',
            'isbn',
            'languages',
            'price',
            'publishedIn',
            'url'
        );

        $object->setData(compact('record','partialCopy'));
        $object->setLabel($data['label']);
        return;
    }

    public function toArray ($object) : array {
        $array = (array) $object;
        $keys = str_replace( '*', '', array_keys( $array ) );
        return array_combine( $keys, array_values( $array ) );
    }

}