<?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 AppDocumentExpeditionFollowUpHydrator 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['code']) || (! empty($this->class->fieldMappings['code']['nullable']) && array_key_exists('code', $data))) {
            $value = $data['code'];
            if ($value !== null) {
                $typeIdentifier = $this->class->fieldMappings['code']['type'];
                $return = (string) $value;
            } else {
                $return = null;
            }
            $this->class->propertyAccessors['code']->setValue($document, $return);
            $hydratedData['code'] = $return;
        }

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

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

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

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

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

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

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

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

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

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

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

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

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

                $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['deliverySlot']->setValue($document, $return);
            $hydratedData['deliverySlot'] = $return;
        }

        // ReferenceOne
        if (isset($data['expedition']) || (! empty($this->class->fieldMappings['expedition']['nullable']) && array_key_exists('expedition', $data))) {
            $return = $data['expedition'];
            if ($return !== null) {
                if ($this->class->fieldMappings['expedition']['storeAs'] !== ClassMetadata::REFERENCE_STORE_AS_ID && ! is_array($return)) {
                    throw HydratorException::associationTypeMismatch('App\Document\ExpeditionFollowUp', 'expedition', 'array', gettype($return));
                }

                $className = $this->dm->getClassNameForAssociation($this->class->fieldMappings['expedition'], $return);
                $identifier = ClassMetadata::getReferenceId($return, $this->class->fieldMappings['expedition']['storeAs']);
                $targetMetadata = $this->dm->getClassMetadata($className);
                $id = $targetMetadata->getPHPIdentifierValue($identifier);
                $return = $this->dm->getReference($className, $id);
            }

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

        // ReferenceOne
        if (isset($data['organization']) || (! empty($this->class->fieldMappings['organization']['nullable']) && array_key_exists('organization', $data))) {
            $return = $data['organization'];
            if ($return !== null) {
                if ($this->class->fieldMappings['organization']['storeAs'] !== ClassMetadata::REFERENCE_STORE_AS_ID && ! is_array($return)) {
                    throw HydratorException::associationTypeMismatch('App\Document\ExpeditionFollowUp', 'organization', 'array', gettype($return));
                }

                $className = $this->dm->getClassNameForAssociation($this->class->fieldMappings['organization'], $return);
                $identifier = ClassMetadata::getReferenceId($return, $this->class->fieldMappings['organization']['storeAs']);
                $targetMetadata = $this->dm->getClassMetadata($className);
                $id = $targetMetadata->getPHPIdentifierValue($identifier);
                $return = $this->dm->getReference($className, $id);
            }

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

        // Field(type: "id")
        if (isset($data['_id']) || (! empty($this->class->fieldMappings['id']['nullable']) && array_key_exists('_id', $data))) {
            $value = $data['_id'];
            if ($value !== null) {
                $typeIdentifier = $this->class->fieldMappings['id']['type'];
                $return = $value instanceof \MongoDB\BSON\ObjectId ? (string) $value : $value;
            } else {
                $return = null;
            }
            $this->class->propertyAccessors['id']->setValue($document, $return);
            $hydratedData['id'] = $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;
    }
}