<?php
declare(strict_types=1);

namespace App;

final class Config
{
    public function __construct(
        public readonly string $env,
        public readonly string $prefix,
        public readonly string $primaryDomain,
        public readonly string $primaryUrl,
        public readonly string $apiBase,
        public readonly string $assetVersion,
        public readonly bool   $dbEnabled,
        public readonly array  $db,
    ) {}

    public static function fromPhpConstants(string $configDir): self
    {
        // config.php defines these constants.
        $env          = defined('APP_ENV') ? (string) APP_ENV : 'prod';
        $prefix       = defined('APP_PREFIX') ? (string) APP_PREFIX : 'app';
        $primaryDom   = defined('APP_DOMAIN_PRIMARY') ? (string) APP_DOMAIN_PRIMARY : 'example.test';
        $primaryUrl   = defined('APP_URL_PRIMARY') ? (string) APP_URL_PRIMARY : 'https://example.test';
        $apiBase      = defined('APP_API_BASE') ? (string) APP_API_BASE : ($primaryUrl . '/api');
        $assetVersion = defined('ASSET_VERSION') ? (string) ASSET_VERSION : '';

        $dbEnabled    = defined('APP_DB_ENABLED') ? (bool) APP_DB_ENABLED : false;

        $dbFileRoot = rtrim($configDir, '/\\') . DIRECTORY_SEPARATOR . 'db.php';
        $dbFileEnv  = rtrim($configDir, '/\\') . DIRECTORY_SEPARATOR . $env . DIRECTORY_SEPARATOR . 'db.php';
        $dbFile     = file_exists($dbFileRoot) ? $dbFileRoot : (file_exists($dbFileEnv) ? $dbFileEnv : null);
        $db         = $dbFile ? (array) require $dbFile : [];

        return new self(
            env: $env,
            prefix: $prefix,
            primaryDomain: $primaryDom,
            primaryUrl: rtrim($primaryUrl, '/'),
            apiBase: rtrim($apiBase, '/'),
            assetVersion: $assetVersion,
            dbEnabled: $dbEnabled,
            db: $db
        );
    }

    public function cookiePrefix(): string
    {
        // Example: add suffix for staging
        if ($this->env === 'staging') {
            return $this->prefix . '_stg_';
        }
        return $this->prefix . '_';
    }

    public function cookieDomain(): string
    {
        // Leading dot for subdomain-wide cookies
        return '.' . ltrim($this->primaryDomain, '.');
    }
}
