<?php

declare(strict_types=1);

namespace App\Support\Navigation;

use App\Support\OperationRunLinks;
use Illuminate\Support\Str;

final class RelatedActionLabelCatalog
{
    /**
     * @var array<string, string>
     */
    private const ENTRY_LABELS = [
        'baseline_profile' => 'Baseline profile',
        'baseline_snapshot' => 'Snapshot',
        'backup_set' => 'Backup set',
        'current_policy_version' => 'Current policy version',
        'operations' => 'Operations',
        'parent_policy' => 'Policy',
        'policy_version' => 'Policy version',
        'restore_run' => 'Restore run',
        'source_run' => 'Operation',
    ];

    /**
     * @var array<string, string>
     */
    private const ACTION_LABELS = [
        'baseline_profile' => 'View baseline profile',
        'baseline_snapshot' => 'View snapshot',
        'backup_set' => 'View backup set',
        'current_policy_version' => 'View policy version',
        'operations' => 'Open operations',
        'parent_policy' => 'View policy',
        'policy_version' => 'View policy version',
        'restore_run' => 'View restore run',
        'source_run' => 'Open operation',
    ];

    public function entryLabel(string $relationKey): string
    {
        if ($relationKey === 'operations') {
            return OperationRunLinks::collectionLabel();
        }

        if ($relationKey === 'source_run') {
            return OperationRunLinks::singularLabel();
        }

        if ($relationKey === 'current_policy_version') {
            return __('localization.policy.versions.related_entry_current_policy_version');
        }

        if ($relationKey === 'parent_policy') {
            return __('localization.policy.versions.related_entry_policy');
        }

        if ($relationKey === 'policy_version') {
            return __('localization.policy.versions.related_entry_policy_version');
        }

        return self::ENTRY_LABELS[$relationKey] ?? Str::headline(str_replace('_', ' ', $relationKey));
    }

    public function actionLabel(string $relationKey): string
    {
        if ($relationKey === 'operations') {
            return OperationRunLinks::openCollectionLabel();
        }

        if ($relationKey === 'source_run') {
            return OperationRunLinks::openLabel();
        }

        if ($relationKey === 'parent_policy') {
            return __('localization.policy.versions.related_action_view_policy');
        }

        if (in_array($relationKey, ['current_policy_version', 'policy_version'], true)) {
            return __('localization.policy.versions.related_action_view_policy_version');
        }

        return self::ACTION_LABELS[$relationKey] ?? 'Open '.Str::headline(str_replace('_', ' ', $relationKey));
    }

    public function unavailableMessage(string $relationKey, string $reason): string
    {
        $subject = mb_strtolower($this->entryLabel($relationKey));

        return match ($reason) {
            'missing', 'deleted' => "The related {$subject} is no longer available.",
            'unauthorized' => "The related {$subject} is not available in the current scope.",
            default => "The related {$subject} could not be resolved.",
        };
    }
}
