<?php

namespace KupShop\GraphQLBundle\ApiAdmin\Types\Catalog\Product\Input;

use KupShop\GraphQLBundle\ApiAdmin\Annotation\Module;
use KupShop\GraphQLBundle\ApiAdmin\Types\SeoInput;
use KupShop\GraphQLBundle\ApiShared\Types\Enums\ProductVisibilityEnum;
use KupShop\GraphQLBundle\ApiShared\Types\Photo\Input\PhotosInput;
use TheCodingMachine\GraphQLite\Annotations\Field;
use TheCodingMachine\GraphQLite\Annotations\Input;

/**
 * @Input(update=true)
 */
class ProductModify
{
    /**
     * ID. Vyplňuje se pouze v případě aktualizace, pokud chceme založit nový produkt, tak ID nevyplňujeme.
     *
     * @Field
     */
    public ?int $id;

    /**
     * Kód.
     *
     * @Field
     */
    public ?string $code;

    /**
     * EAN.
     *
     * @Field
     */
    public ?string $ean;

    /**
     * Počet kusů skladem.
     *
     * @Field
     */
    public ?float $inStore;

    /**
     * Název. Povinný pokud vytváříme nový produkt.
     *
     * @Field
     */
    public ?string $title;

    /**
     * Anotace.
     *
     * @Field
     */
    public ?string $description;

    /**
     * Popis. Může obsahovat i HTML tagy.
     *
     * @Field
     */
    public ?string $longDescription;

    #[Field(description: 'Rozšiřující popis.')]
    public ?string $additionalDescription;

    /**
     * Sleva v procentech.
     *
     * @Field
     */
    public ?float $discount;

    /**
     * Cena.
     *
     * @Field
     */
    public ?PriceModify $price;

    #[Field(description: 'Nákupní cena')]
    #[Module(\Modules::PRODUCTS, \Modules::SUB_PRICE_BUY)]
    public ?PriceModify $priceBuy;

    /**
     * Sazba DPH.
     *
     * @Field
     */
    public ?float $vat;

    /**
     * Viditelnost.
     *
     * @Field()
     */
    public ?ProductVisibilityEnum $visibility;

    /**
     * Viditelnost.
     *
     * @Field
     *
     * @deprecated Use `visibility` field
     */
    public ?bool $visible;

    #[Field(description: 'Id výchozí dostupnosti zboží.')]
    public ?int $deliveryTimeId;

    /**
     * Sekce produktu. Je potřeba poslat ID sekcí.
     *
     * @Field()
     *
     * @var int[]|null
     */
    public ?array $sections;

    /**
     * ID výrobce.
     *
     * @Field()
     */
    public ?int $producerId;

    #[Field(description: 'Obrázky produktu.')]
    public ?PhotosInput $photos;

    /**
     * Váha.
     *
     * @Field
     */
    public ?float $weight;

    /**
     * OSS kategorie. Potřeba vyplnit CN kód dané kategorie.
     *
     * @Field()
     *
     * @Module(module="OSS_VATS")
     */
    public ?string $ossCategory;

    /**
     * Šířka v cm.
     *
     * @Field()
     */
    public ?float $width;

    /**
     * Výška v cm.
     *
     * @Field()
     */
    public ?float $height;

    /**
     * Hloubka v cm.
     *
     * @Field()
     */
    public ?float $depth;

    /**
     * SEO.
     *
     * @Field()
     */
    public ?SeoInput $seo;

    #[Field(description: 'Id měrné jednotky')]
    #[Module(\Modules::PRODUCTS, \Modules::SUB_UNITS)]
    public ?int $productUnitId;

    /**
     * @var int[]|null
     */
    #[Field(description: 'Id štítků produktu.')]
    #[Module(\Modules::LABELS, \Modules::SUB_PRODUCT_LABELS)]
    public ?array $labels;

    #[Module(\Modules::PRODUCTS, \Modules::SUB_UNITS)]
    #[Field(description: 'ID měrné jednotky')]
    public ?int $measureUnitId;

    #[Module(\Modules::PRODUCTS, \Modules::SUB_UNITS)]
    #[Field(description: 'Množství')]
    public ?float $measureQuantity;

    public function getId(): ?int
    {
        return $this->id;
    }

    public function getCode(): ?string
    {
        return $this->code;
    }

    public function getEan(): ?int
    {
        return (int) $this->ean;
    }

    public function getInStore(): ?float
    {
        return $this->inStore;
    }

    public function getTitle(): ?string
    {
        return $this->title;
    }

    public function getDescription(): ?string
    {
        return $this->description;
    }

    public function getLongDescription(): ?string
    {
        return $this->longDescription;
    }

    public function getDiscount(): ?float
    {
        return $this->discount;
    }

    public function getPrice(): ?PriceModify
    {
        return $this->price;
    }

    public function getPriceBuy(): ?PriceModify
    {
        return $this->priceBuy;
    }

    public function getVat(): ?float
    {
        return $this->vat;
    }

    public function getVisible(): ?string
    {
        if (!is_null($this->visible)) {
            return $this->visible ? 'Y' : 'N';
        }

        return null;
    }

    public function getWeight(): ?float
    {
        return $this->weight;
    }

    /**
     * @return PhotoModify[]|null
     */
    public function getPhotos(): ?array
    {
        return $this->photos;
    }

    public function getProductUnitId(): ?int
    {
        return $this->productUnitId;
    }

    public function getDeliveryTimeId(): ?int
    {
        return $this->deliveryTimeId;
    }
}
