<?php

/*
 * This file is part of the Doctrine-TestSet project created by
 * https://github.com/MacFJA
 *
 * For the full copyright and license information, please view the LICENSE
 * at https://github.com/MacFJA/Doctrine-TestSet
 */

namespace AppTestBundle\Entity\FunctionalTests;

use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 *
 * @author MacFJA
 */
class Product
{
    /**
     * The identifier of the product.
     *
     * @var int
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * The creation date of the product.
     *
     * @var \DateTime
     * @ORM\Column(type="datetime", name="created_at")
     */
    protected $createdAt;

    /**
     * List of tags associated to the product.
     *
     * @var string[]
     * @ORM\Column(type="simple_array")
     */
    protected $tags = [];

    /**
     * The EAN 13 of the product. (type set to string in PHP due to 32 bit limitation).
     *
     * @var string
     * @ORM\Column(type="bigint")
     */
    protected $ean;

    /**
     * Indicate if the product is enabled (available in store).
     *
     * @var bool
     * @ORM\Column(type="boolean")
     */
    protected $enabled = false;

    /**
     * test purpose.
     *
     * @var string
     * @ORM\Column(type="string", length=7)
     */
    protected $oddEven = 'odd';

    /**
     * Features of the product.
     * Associative array, the key is the name/type of the feature, and the value the data.
     * Example:<pre>array(
     *     'size' => '13cm x 15cm x 6cm',
     *     'bluetooth' => '4.1'
     * )</pre>.
     *
     * @var array
     * @ORM\Column(type="array")
     */
    protected $features = [];

    /**
     * Features of the product as a formatted HTML content.
     * Example:<pre><ul>
     *     <li><strong>Size</strong>: 13cm x 15cm x 6cm</li>
     *     <li><strong>Bluetooth</strong>: 4.1</li>
     * </ul></pre>.
     *
     * @var string
     * @ORM\Column(type="string")
     */
    protected $htmlFeatures = '';

    /**
     * The price of the product.
     *
     * @var float
     * @ORM\Column(type="float")
     */
    protected $price = 0.0;

    /**
     * The stock of the product.
     *
     * @var int
     * @ORM\Column(type="integer")
     */
    protected $stock = 0;

    /**
     * The reference of the product.
     *
     * @var string
     * @ORM\Column(type="string", unique=true)
     */
    protected $reference;

    /**
     * The name of the product.
     *
     * @var string
     * @ORM\Column(type="string")
     */
    protected $name;

    /**
     * The replenishment type of the product.
     *
     * @var string
     * @ORM\Column(type="string")
     */
    protected $replenishmentType;

    /**
     * The description of the product.
     *
     * @var string
     * @ORM\Column(type="text")
     */
    protected $description;

    /**
     * Category where the product is
     *
     * @var ArrayCollection
     * @ORM\ManyToOne(targetEntity="Category", inversedBy="products")
     */
    protected $category;
    /**
     * The image of the product.
     *
     * @var Image
     * @ORM\OneToOne(targetEntity="Image")
     * @ORM\JoinColumn(name="image_id", referencedColumnName="id")
     */
    protected $image;

    /**
     * @var string
     *
     * @ORM\Column(type="string", length=255, nullable=true)
     */
    protected $phone;

    public static function getReplenishmentTypeValues($withLabelsAsIndexes = false)
    {
        $replenishmentTypeValues = [
            'replenishment_type.auto' => 'auto',
            'replenishment_type.trigger' => 'trigger',
            'replenishment_type.manual' => 'manual',
        ];

        if (!$withLabelsAsIndexes) {
            return \array_values($replenishmentTypeValues);
        }

        return $replenishmentTypeValues;
    }

    /**
     * Constructor of the Product class.
     * (Initialize some fields).
     */
    public function __construct()
    {
        $this->createdAt = new \DateTime();
    }

    /**
     * Add a category in the product association.
     * (Owning side).
     *
     * @param Category $category The category to associate
     */
    public function setCategory(Category $category)
    {
        $this->category = $category;

        return $this;
    }

    /**
     * Set the description of the product.
     *
     * @param string $description
     */
    public function setDescription($description)
    {
        $this->description = $description;
    }

    /**
     * The the full description of the product.
     *
     * @return string
     */
    public function getDescription()
    {
        return $this->description;
    }

    /**
     * Define the EAN code of the product.
     *
     * @param string $ean
     */
    public function setEan($ean)
    {
        $this->ean = $ean;
    }

    /**
     * Get the EAN code.
     *
     * @return string
     */
    public function getEan()
    {
        return $this->ean;
    }

    /**
     * Set if the product is enable.
     *
     * @param bool $enabled
     */
    public function setEnabled($enabled)
    {
        $this->enabled = $enabled;
    }

    /**
     * Is the product enabled?
     *
     * @return bool
     */
    public function getEnabled()
    {
        return $this->enabled;
    }

    /**
     * Alias of getEnabled.
     *
     * @return bool
     */
    public function isEnabled()
    {
        return $this->getEnabled();
    }

    /**
     * Set odd/even.
     *
     * @param string $oddEven
     */
    public function setOddEven($oddEven)
    {
        $this->oddEven = $oddEven;
    }

    /**
     * Get oddEven.
     *
     * @return string
     */
    public function getOddEven()
    {
        return $this->oddEven;
    }

    /**
     * Set the list of features.
     * The parameter is an associative array (key as type, value as data.
     *
     * @param array $features
     */
    public function setFeatures($features)
    {
        $this->features = $features;
    }

    /**
     * Get all product features.
     *
     * @return array
     */
    public function getFeatures()
    {
        return $this->features;
    }

    /**
     * Set the list of HTML features.
     *
     * @param string $htmlFeatures
     */
    public function setHtmlFeatures($htmlFeatures)
    {
        $this->htmlFeatures = $htmlFeatures;
    }

    /**
     * Get all product HTML features.
     *
     * @return string
     */
    public function getHtmlFeatures()
    {
        return $this->htmlFeatures;
    }

    /**
     * Set replenishment type.
     *
     * @param string $replenishmentType
     */
    public function setReplenishmentType($replenishmentType)
    {
        $this->replenishmentType = $replenishmentType;
    }

    /**
     * Get replenishment type.
     *
     * @return string
     */
    public function getReplenishmentType()
    {
        return $this->replenishmentType;
    }

    /**
     * Set the product image.
     *
     * @param Image $image
     */
    public function setImage($image)
    {
        $this->image = $image;
    }

    /**
     * Get the product image.
     *
     * @return Image
     */
    public function getImage()
    {
        return $this->image;
    }

    /**
     * Set the product reference.
     *
     * @param string $reference
     */
    public function setReference($reference)
    {
        $this->reference = $reference;
    }

    /**
     * Retrieve the reference of the product.
     *
     * @return string
     */
    public function getReference()
    {
        return $this->reference;
    }

    /**
     * Set the product name.
     *
     * @param string $name
     */
    public function setName($name)
    {
        $this->name = $name;
    }

    /**
     * Retrieve the name of the product.
     *
     * @return string
     */
    public function getName()
    {
        return $this->name;
    }

    /**
     * Set the price.
     *
     * @param float $price
     */
    public function setPrice($price)
    {
        $this->price = $price;
    }

    /**
     * Get the price of the product.
     *
     * @return float
     */
    public function getPrice()
    {
        return $this->price;
    }

    /**
     * Set the stock.
     *
     * @param int $stock
     */
    public function setStock($stock)
    {
        $this->stock = $stock;
    }

    /**
     * Get the stock of the product.
     *
     * @return int
     */
    public function getStock()
    {
        return $this->stock;
    }

    /**
     * Set the list of the tags.
     *
     * @param string[] $tags
     */
    public function setTags($tags)
    {
        $this->tags = $tags;
    }

    /**
     * Get the list of tags associated to the product.
     *
     * @return string[]
     */
    public function getTags()
    {
        return $this->tags;
    }

    /**
     * Get associated category.
     *
     * @return Category|null
     */
    public function getCategory()
    {
        return $this->category;
    }

    /**
     * Get the date when the product have been created.
     *
     * @return \DateTime
     */
    public function getCreatedAt()
    {
        return $this->createdAt;
    }

    /**
     * Get the id of the product.
     *
     * @return int
     */
    public function getId()
    {
        return $this->id;
    }

    public function __toString()
    {
        return $this->getName();
    }

    /**
     * @param string $phone
     */
    public function setPhone($phone)
    {
        $this->phone = $phone;
    }

    /**
     * @return string
     */
    public function getPhone()
    {
        return $this->phone;
    }
}
