*** Settings ***
Documentation     Architecture and dependency validation tests
Library           OperatingSystem
Library           Collections
Library           String
Resource          ${CURDIR}/common.resource

*** Variables ***
${SRC_DIR}        ${CURDIR}/../src/cleveragents

*** Test Cases ***
Package Structure Should Follow Layered Architecture
    [Documentation]    Verify package structure matches ADR-001
    Directory Should Exist    ${SRC_DIR}

    # Check main packages exist
    Directory Should Exist    ${SRC_DIR}/cli
    Directory Should Exist    ${SRC_DIR}/application
    Directory Should Exist    ${SRC_DIR}/domain
    Directory Should Exist    ${SRC_DIR}/infrastructure
    Directory Should Exist    ${SRC_DIR}/providers
    Directory Should Exist    ${SRC_DIR}/config
    Directory Should Exist    ${SRC_DIR}/core
    Directory Should Exist    ${SRC_DIR}/shared

Package Init Files Should Have Docstrings
    [Documentation]    Verify packages document their responsibilities
    @{packages}=    List Directories In Directory    ${SRC_DIR}
    FOR    ${package}    IN    @{packages}
        ${init_file}=    Set Variable    ${SRC_DIR}/${package}/__init__.py
        ${exists}=    Run Keyword And Return Status    File Should Exist    ${init_file}
        IF    ${exists}
            ${content}=    Get File    ${init_file}
            Should Contain    ${content}    """    Missing docstring in ${package}/__init__.py
        END
    END

Development Tools Should Be Configured
    [Documentation]    Verify development tools are properly configured
    File Should Exist    ${CURDIR}/../pyproject.toml
    File Should Exist    ${CURDIR}/../noxfile.py

    # Check tool configurations in pyproject.toml
    ${pyproject}=    Get File    ${CURDIR}/../pyproject.toml
    Should Contain    ${pyproject}    [tool.ruff]
    Should Contain    ${pyproject}    [tool.pyright]
    Should Contain    ${pyproject}    [tool.coverage]
    Should Contain    ${pyproject}    [tool.hatch]

Modern Tooling Should Be Used
    [Documentation]    Verify no legacy helper scripts - using modern tooling instead
    # Verify we're NOT using legacy scripts (intentionally removed)
    File Should Not Exist    ${CURDIR}/../scripts/install.py
    File Should Not Exist    ${CURDIR}/../scripts/sync.py

    # Verify modern tooling configuration exists
    ${pyproject}=    Get File    ${CURDIR}/../pyproject.toml
    Should Contain    ${pyproject}    [tool.hatch]    Modern build backend (Hatch) should be configured
    Should Contain    ${pyproject}    [project.optional-dependencies]    Dependency groups should be defined

Type Marker Should Exist
    [Documentation]    Verify py.typed marker for type hints
    File Should Exist    ${SRC_DIR}/py.typed

Configuration Should Use CLEVERAGENTS Prefix
    [Documentation]    Verify environment variables use correct prefix
    ${settings_file}=    Set Variable    ${SRC_DIR}/config/settings.py
    File Should Exist    ${settings_file}
    ${content}=    Get File    ${settings_file}
    # Check for CLEVERAGENTS_ prefix
    ${matches}=    Get Regexp Matches    ${content}    CLEVERAGENTS_[A-Z_]+
    ${count}=    Get Length    ${matches}
    Should Be True    ${count} > 0    No CLEVERAGENTS_ variables found in settings

Core Exception Hierarchy Should Be Defined
    [Documentation]    Verify exception hierarchy from ADR-005
    ${exceptions_file}=    Set Variable    ${SRC_DIR}/core/exceptions.py
    File Should Exist    ${exceptions_file}
    ${content}=    Get File    ${exceptions_file}
    Should Contain    ${content}    class CleverAgentsError
    Should Contain    ${content}    class DomainError
    Should Contain    ${content}    class InfrastructureError
    Should Contain    ${content}    class ValidationError

*** Keywords ***
List Files In Directory
    [Arguments]    ${directory}    ${pattern}=*
    @{files}=    OperatingSystem.List Files In Directory    ${directory}    ${pattern}
    RETURN    @{files}

List Directories In Directory
    [Arguments]    ${directory}
    @{items}=    List Directory    ${directory}
    @{dirs}=    Create List
    FOR    ${item}    IN    @{items}
        ${path}=    Set Variable    ${directory}/${item}
        ${is_dir}=    Run Keyword And Return Status    Directory Should Exist    ${path}
        IF    ${is_dir} and not '${item}'.startswith('__')
            Append To List    ${dirs}    ${item}
        END
    END
    RETURN    @{dirs}
