<?php

declare(strict_types=1);

namespace App\Services\Findings;

use App\Models\Finding;
use App\Models\ManagedEnvironment;
use App\Models\Workspace;
use App\Services\Settings\SettingsResolver;
use Carbon\CarbonImmutable;
use InvalidArgumentException;

final class FindingSlaPolicy
{
    public function __construct(
        private readonly SettingsResolver $settingsResolver,
    ) {}

    public function daysForFinding(Finding $finding, ManagedEnvironment $tenant): int
    {
        return $this->daysForSeverity((string) $finding->severity, $tenant);
    }

    public function daysForSeverity(string $severity, ManagedEnvironment $tenant): int
    {
        $workspace = $tenant->workspace;

        if (! $workspace instanceof Workspace) {
            throw new InvalidArgumentException('ManagedEnvironment workspace is required to resolve findings SLA.');
        }

        $policy = $this->settingsResolver->resolveValue($workspace, 'findings', 'sla_days');
        $policy = is_array($policy) ? $policy : [];

        $severity = strtolower(trim($severity));
        $days = $policy[$severity] ?? null;

        if (! is_numeric($days)) {
            throw new InvalidArgumentException(sprintf('No SLA policy days configured for severity [%s].', $severity));
        }

        return (int) $days;
    }

    public function dueAtForSeverity(string $severity, ManagedEnvironment $tenant, ?CarbonImmutable $from = null): CarbonImmutable
    {
        $from ??= CarbonImmutable::now();

        return $from->addDays($this->daysForSeverity($severity, $tenant));
    }
}
