<?php

namespace Lc\CaracoleBundle\Solver\Price;

use Lc\CaracoleBundle\Model\Order\OrderProductInterface;
use Lc\CaracoleBundle\Solver\Product\ProductFamilySolver;
use Lc\CaracoleBundle\Solver\Product\ProductSolver;

class OrderProductPriceSolver
{
    use PriceSolverTrait;

    protected ProductSolver $productSolver;
    protected ProductFamilySolver $productFamilySolver;
    protected ProductPriceSolver $productPriceSolver;

    public function __construct(
            ProductPriceSolver $productPriceSolver,
            ProductSolver $productSolver,
            ProductFamilySolver $productFamilySolver
    ) {
        $this->productPriceSolver = $productPriceSolver;
        $this->productSolver = $productSolver;
        $this->productFamilySolver = $productFamilySolver;
    }

    public function getPrice(OrderProductInterface $orderProduct, $round = false)
    {
        if ($round) {
            return $this->round($orderProduct->getPrice());
        } else {
            return $orderProduct->getPrice();
        }
    }

    public function getBuyingPrice(OrderProductInterface $orderProduct, $round = false)
    {
        if ($round) {
            return $this->round($orderProduct->getBuyingPrice());
        } else {
            return $orderProduct->getBuyingPrice();
        }
    }

    public function getPriceWithTax(OrderProductInterface $orderProduct)
    {
        return $this->applyTax(
                $this->getPrice($orderProduct),
                $orderProduct->getTaxRate()->getValue()
        );
    }

    public function getPriceWithTaxAndReduction(OrderProductInterface $orderProduct)
    {
        return $this->applyReductionCatalog(
                $orderProduct,
                $this->getPrice($orderProduct),
                $this->getPriceWithTax($orderProduct)
        );
    }

    public function getPriceWithReduction(OrderProductInterface $orderProduct, $round = true)
    {
        return $this->applyReductionCatalog(
                $orderProduct,
                $this->getPrice($orderProduct),
                $this->getPriceWithTax($orderProduct),
                1,
                null,
                false,
                $round
        );
    }

    public function getTotal(OrderProductInterface $orderProduct)
    {
        return $orderProduct->getQuantityOrder() * $this->getPrice($orderProduct);
    }

    public function getTotalBuyingPrice(OrderProductInterface $orderProduct)
    {
        return $orderProduct->getQuantityOrder() * $this->getBuyingPrice($orderProduct);
    }

    public function getMargin(OrderProductInterface $orderProduct)
    {
        return $this->round($this->getPriceWithReduction($orderProduct, false) - $this->getBuyingPrice($orderProduct));
    }

    public function getMarginPercent(OrderProductInterface $orderProduct)
    {
        if ($this->getBuyingPrice($orderProduct) && $this->getPriceWithReduction($orderProduct)) {
            return $this->round(($this->getMargin($orderProduct) / $this->getPriceWithReduction($orderProduct)) * 100);
        } else {
            return 0;
        }
    }

    public function getTotalMargin(OrderProductInterface $orderProduct)
    {
        return $orderProduct->getQuantityOrder() * $this->getMargin($orderProduct);
    }


    public function getTotalWithReduction(OrderProductInterface $orderProduct)
    {
        return $this->applyReductionCatalog(
                $orderProduct,
                $this->getTotal($orderProduct),
                $this->getTotalWithTax($orderProduct),
                $orderProduct->getQuantityOrder(),
                null,
                false
        );
    }

    public function getTotalWithTax(OrderProductInterface $orderProduct)
    {

        return $this->applyTax(
                $this->getTotal($orderProduct),
                $orderProduct->getTaxRate()->getValue()
        );
    }

    public function getTotalWithTaxAndReduction(OrderProductInterface $orderProduct)
    {
        return $this->applyReductionCatalog(
                $orderProduct,
                $this->getTotal($orderProduct),
                $this->getTotalWithTax($orderProduct),
                $orderProduct->getQuantityOrder()
        );
    }

    public function getTotalBuyingPriceWithTax(OrderProductInterface $orderProduct)
    {
        return $this->applyTax(
                $this->getTotalBuyingPrice($orderProduct),
                $orderProduct->getTaxRate()->getValue()
        );
    }

    //inclus toujours les réductions catalogues
    public function getTotalTaxes(OrderProductInterface $orderProduct)
    {
        return $this->getTotalWithTaxAndReduction($orderProduct) - $this->getTotalWithReduction($orderProduct);
    }
}