<?php

declare(strict_types=1);

namespace Autogedal\FeedMonitor\Test\Unit\Model;

use Autogedal\FeedMonitor\Model\Config;
use Magento\Framework\App\Config\ScopeConfigInterface;
use PHPUnit\Framework\TestCase;

class ConfigTest extends TestCase
{
    public function testThresholdsComeFromTheSubFeedThenTheJobThenTheDefault(): void
    {
        $config = $this->config([
            'autogedal_feed_monitor/guard/incomplete_threshold' => '50',
            'autogedal_feed_monitor/guard/threshold_overrides' => "ptc_update_stock=70\n autogedal_feed_oos_products:schiuri = 30% \nnot a rule\nbad=abc",
        ]);

        self::assertSame(70.0, $config->getIncompleteThreshold('ptc_update_stock'));
        self::assertSame(30.0, $config->getIncompleteThreshold('autogedal_feed_oos_products', 'schiuri'));
        self::assertSame(50.0, $config->getIncompleteThreshold('autogedal_feed_oos_products', 'cutii'));
        self::assertSame(50.0, $config->getIncompleteThreshold('bad'));
    }

    public function testRecipientsAcceptLinesAndCommasAndDropInvalidAddresses(): void
    {
        $config = $this->config([
            'autogedal_feed_monitor/email/recipients' => "alex@autogedal.ro, office@autogedal.ro\nnot-an-email\nalex@autogedal.ro",
        ]);

        self::assertSame(['alex@autogedal.ro', 'office@autogedal.ro'], $config->getRecipients());
    }

    public function testTheMaxAgeComesFromTheAdminElseFromTheJob(): void
    {
        $config = $this->config([
            'autogedal_feed_monitor/schedule/max_age' => "alfaromtrans_paravanturi_stock=2000\nsmartbill_stock_update = 90",
        ]);

        self::assertSame(2000, $config->getMaxAgeMinutes('alfaromtrans_paravanturi_stock', 1560));
        self::assertSame(90, $config->getMaxAgeMinutes('smartbill_stock_update', 60));
        self::assertSame(180, $config->getMaxAgeMinutes('ptc_update_stock', 180));
    }

    public function testAJobCanBeAllowedToRunLongerBeforeItIsConsideredStuck(): void
    {
        $config = $this->config([
            'autogedal_feed_monitor/history/stuck_after_minutes' => '120',
            'autogedal_feed_monitor/history/stuck_after_overrides' => "smartbill_stock_update=240\nptc_update_stock=90",
        ]);

        self::assertSame(240, $config->getStuckAfterMinutes('smartbill_stock_update'));
        self::assertSame(120, $config->getStuckAfterMinutes('alfaromtrans_paravanturi_stock'));
        self::assertSame(90, $config->getShortestStuckAfterMinutes());
    }

    private function config(array $values): Config
    {
        $scopeConfig = $this->createMock(ScopeConfigInterface::class);
        $scopeConfig->method('getValue')->willReturnCallback(static fn (string $path) => $values[$path] ?? null);

        return new Config($scopeConfig);
    }
}
