<?php

namespace YooMoney\Helpers;

use Exception;
use YooMoney\Model\OrderModel;
use Joomla\Component\Jshopping\Site\Table\OrderTable;

/**
 * Класс методов для работы с заказами
 */
class OrderHelper
{
    /**
     * @var JVersionDependenciesHelper
     */
    private $dependenciesHelper;

    /**
     * @var OrderModel
     */
    private $orderModel;

    /**
     * @var LoggerHelper
     */
    private $logger;

    public function __construct()
    {
        $this->dependenciesHelper = new JVersionDependenciesHelper();
        $this->orderModel = new OrderModel();
        $this->logger = new LoggerHelper();
    }

    /**
     * Сохраняет запись в истории к заказу
     *
     * @param $order
     * @param $comments
     * @return mixed
     */
    public function saveOrderHistory($order, $comments)
    {
        $history                    = \JSFactory::getTable('orderHistory', 'jshop');
        $history->order_id          = $order->order_id;
        $history->order_status_id   = $order->order_status;
        $history->status_date_added = $this->dependenciesHelper->getJsDate();
        $history->customer_notify   = 0;
        $history->comments          = $comments;

        return $history->store();
    }

    /**
     * Добавление скидки в заказ (применяется к товарам, налогам и доставке)
     * и пересчет общей стоимости заказа
     *
     * @param OrderTable $order
     * @param float $amount
     * @return void
     * @throws Exception
     */
    public function addDiscount($order, $amount)
    {
        $currentOrderTotal = (float)$order->order_total;

        /** Высчитываем процент, по которому будем вычислять скидку для всех позиций в заказе */
        $percentDiscount = round(100 / ($currentOrderTotal / (int)$amount), 1);

        /** Получаем все товары, что есть в заказе */
        $products = $this->orderModel->getOrderItemsByOrderId((int)$order->order_id);
        if (!$products) {
            throw new Exception(sprintf('Error to get information about products in order: %s ', $order->order_id));
        }
        foreach ($products as $product) {
            /** Перерасчитываем и сохраняем стоимость товара с учетом скидки */
            $this->orderModel->updateOrderItemByOrderItemId(
                (int)$product->order_item_id,
                [
                    'product_item_price' => $this->calculateTotalFromPercent((float)$product->product_item_price, $percentDiscount)
                ]
            );
        }
        $orderTotalNew = $currentOrderTotal - $amount;
        $taxes = $order->getTaxExt();
        foreach ($taxes as $key => $tax) {
            /** Перерасчитываем все налоги, что применены к заказу с учетом скидки */
            $taxes[$key] = $this->calculateTotalFromPercent((float)$tax, $percentDiscount);
        }
        $order->setTaxExt($taxes);
        $order->order_tax = $this->calculateTotalFromPercent((float)$order->order_tax, $percentDiscount);
        $order->order_shipping = $this->calculateTotalFromPercent((float)$order->order_shipping, $percentDiscount);
        $order->order_discount = $amount;
        $order->order_total = $orderTotalNew;
        $order->order_subtotal = $orderTotalNew;
        $order->saveOrderHistory(false, _JSHOP_YOO_SBER_LOAN_NAME_DISCOUNT . ': -' . $amount);
        $order->store();
    }

    /**
     * Вычисление процента из числа
     *
     * @param float $total Общая сумма
     * @param float $percent Процент, который хотим вычесть из числа
     *
     * @return float
     */
    private function calculateTotalFromPercent($total, $percent)
    {
        return $total - ($percent * ($total / 100));
    }

    /**
     * @param OrderTable $orderId
     * @param float $discountAmount
     * @return void
     */
    public function tryToAddSberLoanDiscount($orderId, $discountAmount)
    {
        try {
            $this->logger->log('info', 'Adding discount to order. Discount amount: ' . $discountAmount);
            $this->addDiscount(
                $orderId,
                $discountAmount
            );
        } catch (Exception $e) {
            $this->logger->log(
                'error',
                'Error adding discount to order',
                array('exception' => $e->getMessage())
            );
            header('HTTP/1.1 500 Server error');
            die();
        }
    }
}