<?php

namespace KupShop\ProductSetsBundle\Tests;

use KupShop\ProductSetsBundle\Utils\MultiSetUtil;

class MultisetTest extends \DatabaseTestCase
{
    private MultiSetUtil $multiSetUtil;

    protected function setUp(): void
    {
        parent::setUp();

        $this->multiSetUtil = $this->get(MultiSetUtil::class);
    }

    /** @dataProvider data_testMultiSetUtilGetPriceFrom */
    public function testMultiSetUtilGetPriceFrom(string $type, int $masterProductId, float $expectedPriceFrom): void
    {
        $this->setMultiSetPriceCalculateType($type);

        foreach ($this->multiSetUtil->getPriceFrom([$masterProductId]) as $item) {
            $this->assertEqualsWithDelta($expectedPriceFrom, $item['price'], 0.0001);
        }
    }

    public function data_testMultiSetUtilGetPriceFrom(): iterable
    {
        // Použít cenu setového produktu
        yield 'calcTypePrice' => [MultiSetUtil::CALCULATE_TYPE_PRICE, 1, 2478.5124];

        // Vypočítat cenu podle položek, ze kterých se set skládá + aplikovat slevu ze setového produktu
        yield 'calcTypeProductsPriceDiscounted' => [MultiSetUtil::CALCULATE_TYPE_PRODUCTS_PRICE_DISCOUNTED, 1, 1197.5205];

        // Vypočítat cenu podle položek bez aplikované cenové hladiny, ze kterých se set skládá + aplikovat slevu ze setového produktu
        yield 'calcTypeProductsPriceDiscountedWithoutPriceLevel' => [MultiSetUtil::CALCULATE_TYPE_PRODUCTS_PRICE_DISCOUNTED_WITHOUT_PRICELEVEL, 1, 1197.5205];

        // Vypočítat cenu podle položek, ze kterých se set skládá + aplikovat slevu ze setového produktu
        // cenu jsou predefinovane v set_products - sleva od produktu by nemela byt aplikovana
        yield 'calcTypeProductsPriceDiscountedWithOverriddenPrices' => [MultiSetUtil::CALCULATE_TYPE_PRODUCTS_PRICE_DISCOUNTED, 4, 826.4462];
    }

    public function testCheckMultisetPriceCalculateEndpoint()
    {
        $this->setMultiSetPriceCalculateType('productsPriceDiscounted');

        $data = [
            0 => [
                'id_category' => 1,
                'id_product' => 23919,
                'id_variation' => 11538,
                'is_valid' => true,
            ],
            1 => [
                'id_category' => 2,
                'id_product' => 33522,
                'id_variation' => null,
                'is_valid' => true,
            ],
        ];

        $product = new \Product();
        $product->createFromDB(36218);
        $price = $product->getPrice(null, ['sets' => $data], \DecimalConstants::one());

        $this->assertEquals(3049, round($price->asFloat() * 1.21));
    }

    public function getDataSet()
    {
        return $this->getJsonDataSetFromFile();
    }

    private function setMultiSetPriceCalculateType(string $type): void
    {
        $dbcfg = \Settings::getDefault();

        $dbcfg->saveValue('multisets', [
            'price_calc_type' => $type,
        ]);

        \Settings::clearCache(true);
    }
}
