"""Tests para config_from_env."""

import os
from dataclasses import dataclass, field

import pytest

from config_from_env import config_from_env


@dataclass
class SimpleConfig:
    host: str = field(default="localhost", metadata={"env": "CFE_PY_HOST", "default": "localhost"})
    port: int = field(default=8080, metadata={"env": "CFE_PY_PORT", "default": "8080"})
    debug: bool = field(default=False, metadata={"env": "CFE_PY_DEBUG", "default": "false"})
    ratio: float = field(default=1.0, metadata={"env": "CFE_PY_RATIO", "default": "1.0"})
    tags: list = field(default_factory=list, metadata={"env": "CFE_PY_TAGS", "default": "a,b"})


@dataclass
class RequiredConfig:
    api_key: str = field(default="", metadata={"env": "CFE_PY_API_KEY", "required": True})


def _clean(*keys: str) -> None:
    for k in keys:
        os.environ.pop(k, None)


def test_populate_string_desde_env():
    os.environ["CFE_PY_HOST"] = "myhost"
    try:
        cfg = config_from_env(SimpleConfig)
        assert cfg.host == "myhost"
    finally:
        _clean("CFE_PY_HOST")


def test_populate_int_con_conversion():
    os.environ["CFE_PY_PORT"] = "9090"
    try:
        cfg = config_from_env(SimpleConfig)
        assert cfg.port == 9090
    finally:
        _clean("CFE_PY_PORT")


def test_populate_bool_true():
    os.environ["CFE_PY_DEBUG"] = "true"
    try:
        cfg = config_from_env(SimpleConfig)
        assert cfg.debug is True
    finally:
        _clean("CFE_PY_DEBUG")


def test_populate_float_field():
    os.environ["CFE_PY_RATIO"] = "3.14"
    try:
        cfg = config_from_env(SimpleConfig)
        assert abs(cfg.ratio - 3.14) < 1e-9
    finally:
        _clean("CFE_PY_RATIO")


def test_populate_list_comma_separated():
    os.environ["CFE_PY_TAGS"] = "x,y,z"
    try:
        cfg = config_from_env(SimpleConfig)
        assert cfg.tags == ["x", "y", "z"]
    finally:
        _clean("CFE_PY_TAGS")


def test_default_usado_cuando_env_no_seteada():
    _clean("CFE_PY_PORT")
    cfg = config_from_env(SimpleConfig)
    assert cfg.port == 8080


def test_required_sin_valor_lanza_error():
    _clean("CFE_PY_API_KEY")
    with pytest.raises(ValueError, match="required"):
        config_from_env(RequiredConfig)


def test_no_dataclass_lanza_type_error():
    class NotADataclass:
        pass

    with pytest.raises(TypeError):
        config_from_env(NotADataclass)
