import logging

from pydantic import BaseModel

from openapi_pydantic import Reference, schema_validate
from openapi_pydantic.compat import (
    DEFS_KEY,
    PYDANTIC_V2,
    ConfigDict,
    Extra,
    models_json_schema,
    v1_schema,
)


def test_schema() -> None:
    schema = schema_validate(
        {
            "title": "reference list",
            "description": "schema for list of reference type",
            "allOf": [{"$ref": "#/definitions/TestType"}],
        }
    )
    logging.debug(f"schema.allOf={schema.allOf}")
    assert schema.allOf
    assert isinstance(schema.allOf, list)
    assert isinstance(schema.allOf[0], Reference)
    assert schema.allOf[0].ref == "#/definitions/TestType"


def test_additional_properties_is_bool() -> None:
    class TestModel(BaseModel):
        test_field: str

        if PYDANTIC_V2:
            model_config = ConfigDict(
                extra="forbid",
            )

        else:

            class Config:
                extra = Extra.forbid

    if PYDANTIC_V2:
        _key_map, schema_definition = models_json_schema([(TestModel, "validation")])
    else:
        schema_definition = v1_schema([TestModel])

    assert schema_definition == {
        DEFS_KEY: {
            "TestModel": {
                "title": "TestModel",
                "type": "object",
                "properties": {"test_field": {"title": "Test Field", "type": "string"}},
                "required": ["test_field"],
                "additionalProperties": False,
            }
        }
    }

    # allow "additionalProperties" to have boolean value
    result = schema_validate(schema_definition[DEFS_KEY]["TestModel"])
    assert result.additionalProperties is False