import os
from pathlib import Path
from typing import Annotated

from pydantic import AfterValidator, ValidationInfo

FRIGATE_ENV_VARS = {k: v for k, v in os.environ.items() if k.startswith("FRIGATE_")}
# read docker secret files as env vars too
if os.path.isdir("/run/secrets") and os.access("/run/secrets", os.R_OK):
    for secret_file in os.listdir("/run/secrets"):
        if secret_file.startswith("FRIGATE_"):
            FRIGATE_ENV_VARS[secret_file] = (
                Path(os.path.join("/run/secrets", secret_file)).read_text().strip()
            )


def validate_env_string(v: str) -> str:
    return v.format(**FRIGATE_ENV_VARS)


EnvString = Annotated[str, AfterValidator(validate_env_string)]


def validate_env_vars(v: dict[str, str], info: ValidationInfo) -> dict[str, str]:
    if isinstance(info.context, dict) and info.context.get("install", False):
        for k, v in v.items():
            os.environ[k] = v

    return v


EnvVars = Annotated[dict[str, str], AfterValidator(validate_env_vars)]
