<?php
namespace PrestaShop\Module\LCVPrestaConnector\Models;

/**
 * Objet d'interface contenant la définition d'un article (taille)
 */
class Article extends SanitizedObject
{
    /**
     * Précision des arrondis
     * @var int
     */
    public const PRICE_PRECISION = 6;

    /**
     * Seuil sous lequel un écart de prix est considéré comme du bruit d'arrondi
     * et ignoré : une demi-unité de la dernière décimale (0,5 × 10^-PRICE_PRECISION).
     * @var float
     */
    public const PRICE_EPSILON = 0.5 / (10 ** self::PRICE_PRECISION);

    /**
     * Référence de l'article
     *      
     */
    public string $ref;

    /**
     * Nom de la taille de l'article
     * 
     * @var string
     */
    public string $name;

    /**
     * Code EAN13 publique
     */
    public ?string $ean13 = null;

    /**
     * Prix TTC de l'article
     */
    public ?float $priceTTC = null;

    /**
     * Prix HT de l'article
     */
    public ?float $priceHT = null;

    /**
     * Zonage de l'article
     */
    public ?string $warehouseLocation = null;

    /**
     * Obtient le prix HT de l'article
     * 
     * @param Product $product Produit parent
     */
    public function getPriceHT(Product $product)
    {         
        if ($this->priceHT === NULL && $this->priceTTC !== NULL)
            $this->priceHT = round($this->priceTTC / (1 + ($product->taxrate ?? 0)), self::PRICE_PRECISION);        
        return $this->priceHT ?? 0;
    }

    /**
     * Obtient le prix TTC de l'article
     * 
     * @param Product $product Produit parent
     */
    public function getPriceTTC(Product $product)
    {
        if ($this->priceTTC === NULL && $this->priceHT !== NULL)
            $this->priceTTC = round($this->priceHT * (1 + ($product->taxrate ?? 0)), self::PRICE_PRECISION);
        return $this->priceTTC ?? 0;
    }

    /**
     * Nouvel article / taille
     * 
     * @param string $ref Codes-barre de la taille
     * @param string $name Nom de la taille de l'article
     */
    public function __construct(
        string $ref,
        string $name
        )
    {
        $this->ref = $ref;
        $this->name = $name;
    }

    /**
     * Nettoyage de la donnée sur les standards Prestashop
     */
    public function sanitize()
    {
        // Arrondi du prix à X décimales pour éviter les problèmes d'arrondi qui font que le prix minimum n'est pas exactement égal au prix du produit
        if (isset($this->priceHT))            
            $this->priceHT = round($this->priceHT, self::PRICE_PRECISION);
        if (isset($this->priceTTC))
            $this->priceTTC = round($this->priceTTC, self::PRICE_PRECISION);
    }
}