<?php
/**
 * NOTICE OF LICENSE
 *
 * @author Mondial Relay <offrestart@mondialrelay.fr>
 * @copyright Copyright (c) Mondial Relay
 * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
 */
if (!defined('_PS_VERSION_')) {
    exit;
}

class MondialrelayReturnLabel extends ObjectModel
{
    /** @var int */
    public $id_order;

    /** @var int */
    public $id_customer;

    /** @var string */
    public $tracking_number;

    /** @var string */
    public $status;

    /** @var string */
    public $label_url;

    /** @var string */
    public $date_add;

    /** @var string */
    public $date_upd;

    public static $definition = [
        'table' => 'mondialrelay_return_label',
        'primary' => 'id_mondialrelay_return_label',
        'fields' => [
            'id_order' => ['type' => self::TYPE_INT, 'validate' => 'isUnsignedId', 'required' => true],
            'id_customer' => ['type' => self::TYPE_INT, 'validate' => 'isUnsignedId', 'allow_null' => true],
            'tracking_number' => ['type' => self::TYPE_STRING, 'size' => 64, 'allow_null' => true],
            'status' => ['type' => self::TYPE_STRING, 'size' => 128, 'allow_null' => true],
            'label_url' => ['type' => self::TYPE_STRING, 'size' => 1000, 'allow_null' => true],
            'date_add' => ['type' => self::TYPE_DATE, 'validate' => 'isDate'],
            'date_upd' => ['type' => self::TYPE_DATE, 'validate' => 'isDate'],
        ],
    ];

    /**
     * Persist a return label line for an order.
     *
     * @param int $idOrder
     * @param int|null $idCustomer
     * @param string $trackingNumber
     * @param string $status
     * @param string $labelUrl
     * @return bool
     */
    public static function createForOrder($idOrder, $idCustomer, $trackingNumber, $status, $labelUrl)
    {
        $label = new self();
        $label->id_order = (int) $idOrder;
        $label->id_customer = $idCustomer ? (int) $idCustomer : null;
        $label->tracking_number = (string) $trackingNumber;
        $label->status = (string) $status;
        $label->label_url = (string) $labelUrl;

        return (bool) $label->add();
    }

    /**
     * Retrieve the latest return label for one order.
     *
     * @param int $idOrder
     * @return self|null
     */
    public static function getLastByOrderId($idOrder)
    {
        $query = new DbQuery();
        $query->select(self::$definition['primary'])
            ->from(self::$definition['table'])
            ->where('id_order = ' . (int) $idOrder)
            ->orderBy(self::$definition['primary'] . ' DESC');

        $idLabel = (int) Db::getInstance()->getValue($query);
        if ($idLabel <= 0) {
            return null;
        }

        $label = new self($idLabel);

        return Validate::isLoadedObject($label) ? $label : null;
    }

    /**
     * Upsert one return label row for an order.
     *
     * @param int $idOrder
     * @param int|null $idCustomer
     * @param string $trackingNumber
     * @param string $status
     * @param string $labelUrl
     * @return bool
     */
    public static function upsertForOrder($idOrder, $idCustomer, $trackingNumber, $status, $labelUrl)
    {
        $label = self::getLastByOrderId((int) $idOrder);
        if (!$label) {
            $label = new self();
            $label->id_order = (int) $idOrder;
            $label->id_customer = $idCustomer ? (int) $idCustomer : null;
        }

        $label->tracking_number = (string) $trackingNumber;
        $label->status = (string) $status;
        $label->label_url = (string) $labelUrl;

        if (Validate::isLoadedObject($label)) {
            return (bool) $label->update();
        }

        return (bool) $label->add();
    }
}
