<?php

namespace Hydrators;

use Doctrine\ODM\MongoDB\DocumentManager;
use Doctrine\ODM\MongoDB\Hydrator\HydratorException;
use Doctrine\ODM\MongoDB\Hydrator\HydratorInterface;
use Doctrine\ODM\MongoDB\Query\Query;
use Doctrine\ODM\MongoDB\Mapping\ClassMetadata;

use function array_key_exists;
use function gettype;
use function is_array;

/**
 * THIS CLASS WAS GENERATED BY THE DOCTRINE ODM. DO NOT EDIT THIS FILE.
 */
class AppDocumentTrackingInfosHydrator implements HydratorInterface
{
    public function __construct(private DocumentManager $dm, private ClassMetadata $class) {}

    public function hydrate(object $document, array $data, array $hints = []): array
    {
        $hydratedData = [];

        // Field(type: "string")
        if (isset($data['lastEventCode']) || (! empty($this->class->fieldMappings['lastEventCode']['nullable']) && array_key_exists('lastEventCode', $data))) {
            $value = $data['lastEventCode'];
            if ($value !== null) {
                $typeIdentifier = $this->class->fieldMappings['lastEventCode']['type'];
                $return = (string) $value;
            } else {
                $return = null;
            }
            $this->class->propertyAccessors['lastEventCode']->setValue($document, $return);
            $hydratedData['lastEventCode'] = $return;
        }

        // Field(type: "string")
        if (isset($data['receiptUrl']) || (! empty($this->class->fieldMappings['receiptUrl']['nullable']) && array_key_exists('receiptUrl', $data))) {
            $value = $data['receiptUrl'];
            if ($value !== null) {
                $typeIdentifier = $this->class->fieldMappings['receiptUrl']['type'];
                $return = (string) $value;
            } else {
                $return = null;
            }
            $this->class->propertyAccessors['receiptUrl']->setValue($document, $return);
            $hydratedData['receiptUrl'] = $return;
        }

        // Field(type: "string")
        if (isset($data['receiptNumber']) || (! empty($this->class->fieldMappings['receiptNumber']['nullable']) && array_key_exists('receiptNumber', $data))) {
            $value = $data['receiptNumber'];
            if ($value !== null) {
                $typeIdentifier = $this->class->fieldMappings['receiptNumber']['type'];
                $return = (string) $value;
            } else {
                $return = null;
            }
            $this->class->propertyAccessors['receiptNumber']->setValue($document, $return);
            $hydratedData['receiptNumber'] = $return;
        }

        // Field(type: "string")
        if (isset($data['carrierTrackingUrl']) || (! empty($this->class->fieldMappings['carrierTrackingUrl']['nullable']) && array_key_exists('carrierTrackingUrl', $data))) {
            $value = $data['carrierTrackingUrl'];
            if ($value !== null) {
                $typeIdentifier = $this->class->fieldMappings['carrierTrackingUrl']['type'];
                $return = (string) $value;
            } else {
                $return = null;
            }
            $this->class->propertyAccessors['carrierTrackingUrl']->setValue($document, $return);
            $hydratedData['carrierTrackingUrl'] = $return;
        }

        // Field(type: "string")
        if (isset($data['carrierNumber']) || (! empty($this->class->fieldMappings['carrierNumber']['nullable']) && array_key_exists('carrierNumber', $data))) {
            $value = $data['carrierNumber'];
            if ($value !== null) {
                $typeIdentifier = $this->class->fieldMappings['carrierNumber']['type'];
                $return = (string) $value;
            } else {
                $return = null;
            }
            $this->class->propertyAccessors['carrierNumber']->setValue($document, $return);
            $hydratedData['carrierNumber'] = $return;
        }

        // Field(type: "date")
        if (array_key_exists('deliveredAt', $data) && ($data['deliveredAt'] !== null || ($this->class->fieldMappings['deliveredAt']['nullable'] ?? false))) {
            $value = $data['deliveredAt'];
            if ($value === null) { $return = null; } else { $return = \Doctrine\ODM\MongoDB\Types\DateType::getDateTime($value); }
            $this->class->propertyAccessors['deliveredAt']->setValue($document, $return === null ? null : clone $return);
            $hydratedData['deliveredAt'] = $return;
        }

        // EmbedOne
        if (isset($data['eta']) || (! empty($this->class->fieldMappings['eta']['nullable']) && array_key_exists('eta', $data))) {
            $return = $data['eta'];
            if ($return !== null) {
                $embeddedDocument = $return;

                if (! is_array($embeddedDocument)) {
                    throw HydratorException::associationTypeMismatch('App\Document\TrackingInfos', 'eta', 'array', gettype($embeddedDocument));
                }
        
                $className = $this->dm->getClassNameForAssociation($this->class->fieldMappings['eta'], $embeddedDocument);
                $embeddedMetadata = $this->dm->getClassMetadata($className);
                $return = $embeddedMetadata->newInstance();

                $this->dm->getUnitOfWork()->setParentAssociation($return, $this->class->fieldMappings['eta'], $document, 'eta');

                $embeddedData = $this->dm->getHydratorFactory()->hydrate($return, $embeddedDocument, $hints);
                $embeddedId = $embeddedMetadata->identifier && isset($embeddedData[$embeddedMetadata->identifier]) ? $embeddedData[$embeddedMetadata->identifier] : null;

                if (empty($hints[Query::HINT_READ_ONLY])) {
                    $this->dm->getUnitOfWork()->registerManaged($return, $embeddedId, $embeddedData);
                }
            }

            $this->class->propertyAccessors['eta']->setValue($document, $return);
            $hydratedData['eta'] = $return;
        }

        // Field(type: "string")
        if (isset($data['amazonTrackingNumber']) || (! empty($this->class->fieldMappings['amazonTrackingNumber']['nullable']) && array_key_exists('amazonTrackingNumber', $data))) {
            $value = $data['amazonTrackingNumber'];
            if ($value !== null) {
                $typeIdentifier = $this->class->fieldMappings['amazonTrackingNumber']['type'];
                $return = (string) $value;
            } else {
                $return = null;
            }
            $this->class->propertyAccessors['amazonTrackingNumber']->setValue($document, $return);
            $hydratedData['amazonTrackingNumber'] = $return;
        }

        // Field(type: "string")
        if (isset($data['deliverySlotLink']) || (! empty($this->class->fieldMappings['deliverySlotLink']['nullable']) && array_key_exists('deliverySlotLink', $data))) {
            $value = $data['deliverySlotLink'];
            if ($value !== null) {
                $typeIdentifier = $this->class->fieldMappings['deliverySlotLink']['type'];
                $return = (string) $value;
            } else {
                $return = null;
            }
            $this->class->propertyAccessors['deliverySlotLink']->setValue($document, $return);
            $hydratedData['deliverySlotLink'] = $return;
        }

        // Field(type: "string")
        if (isset($data['realTimeTrackingUrl']) || (! empty($this->class->fieldMappings['realTimeTrackingUrl']['nullable']) && array_key_exists('realTimeTrackingUrl', $data))) {
            $value = $data['realTimeTrackingUrl'];
            if ($value !== null) {
                $typeIdentifier = $this->class->fieldMappings['realTimeTrackingUrl']['type'];
                $return = (string) $value;
            } else {
                $return = null;
            }
            $this->class->propertyAccessors['realTimeTrackingUrl']->setValue($document, $return);
            $hydratedData['realTimeTrackingUrl'] = $return;
        }

        // Field(type: "collection")
        if (isset($data['kolisoftPackages']) || (! empty($this->class->fieldMappings['kolisoftPackages']['nullable']) && array_key_exists('kolisoftPackages', $data))) {
            $value = $data['kolisoftPackages'];
            if ($value !== null) {
                $typeIdentifier = $this->class->fieldMappings['kolisoftPackages']['type'];
                $return = array_values($value);
            } else {
                $return = null;
            }
            $this->class->propertyAccessors['kolisoftPackages']->setValue($document, $return);
            $hydratedData['kolisoftPackages'] = $return;
        }

        // Field(type: "collection")
        if (isset($data['returnParcelIds']) || (! empty($this->class->fieldMappings['returnParcelIds']['nullable']) && array_key_exists('returnParcelIds', $data))) {
            $value = $data['returnParcelIds'];
            if ($value !== null) {
                $typeIdentifier = $this->class->fieldMappings['returnParcelIds']['type'];
                $return = array_values($value);
            } else {
                $return = null;
            }
            $this->class->propertyAccessors['returnParcelIds']->setValue($document, $return);
            $hydratedData['returnParcelIds'] = $return;
        }

        // Field(type: "date")
        if (array_key_exists('createdAt', $data) && ($data['createdAt'] !== null || ($this->class->fieldMappings['createdAt']['nullable'] ?? false))) {
            $value = $data['createdAt'];
            if ($value === null) { $return = null; } else { $return = \Doctrine\ODM\MongoDB\Types\DateType::getDateTime($value); }
            $this->class->propertyAccessors['createdAt']->setValue($document, $return === null ? null : clone $return);
            $hydratedData['createdAt'] = $return;
        }

        // Field(type: "date")
        if (array_key_exists('updatedAt', $data) && ($data['updatedAt'] !== null || ($this->class->fieldMappings['updatedAt']['nullable'] ?? false))) {
            $value = $data['updatedAt'];
            if ($value === null) { $return = null; } else { $return = \Doctrine\ODM\MongoDB\Types\DateType::getDateTime($value); }
            $this->class->propertyAccessors['updatedAt']->setValue($document, $return === null ? null : clone $return);
            $hydratedData['updatedAt'] = $return;
        }

        return $hydratedData;
    }
}