<?php

declare(strict_types=1);

namespace Ekdos\Support;

/** Die gelesene Umgebung, einmal beim Start eingesammelt. */
final readonly class Config
{
    private function __construct(private array $values) {}

    public static function fromEnvironment(array $environment): self
    {
        return new self($environment);
    }

    public function string(string $key, string $fallback = ''): string
    {
        $value = $this->values[$key] ?? null;

        return is_string($value) && trim($value) !== '' ? trim($value) : $fallback;
    }

    public function int(string $key, int $fallback): int
    {
        $value = $this->values[$key] ?? null;

        return is_numeric($value) ? (int) $value : $fallback;
    }

    public function bool(string $key, bool $fallback): bool
    {
        $value = $this->values[$key] ?? null;

        if (is_bool($value)) {
            return $value;
        }

        return match (is_string($value) ? strtolower(trim($value)) : null) {
            '1', 'true', 'yes', 'on' => true,
            '0', 'false', 'no', 'off' => false,
            default => $fallback,
        };
    }

    /** true, sobald ein Wert (z. B. ein geteiltes Geheimnis) hinterlegt ist. */
    public function has(string $key): bool
    {
        return $this->string($key) !== '';
    }
}
