"""Offline diagnosis of already observed fictitious checks. No network probes."""
from dataclasses import dataclass, replace


@dataclass(frozen=True)
class Observation:
    relay_connected: bool | None
    target_name_resolved: bool | None
    target_tcp_reached: bool | None
    target_tls_verified: bool | None
    erp_identity_accepted: bool | None
    api_enabled: bool | None
    erp_operation_allowed: bool | None
    response_matches_contract: bool | None


LAYERS = [
    ('relay_connected', 'REVIEW_RELAY_CONNECTION'),
    ('target_name_resolved', 'REVIEW_LOCAL_DNS'),
    ('target_tcp_reached', 'REVIEW_TARGET_TCP'),
    ('target_tls_verified', 'REVIEW_TARGET_TLS'),
    ('erp_identity_accepted', 'REVIEW_ERP_IDENTITY'),
    ('api_enabled', 'REVIEW_ERP_INTERFACE'),
    ('erp_operation_allowed', 'REVIEW_ERP_PERMISSION'),
    ('response_matches_contract', 'REVIEW_RESPONSE_CONTRACT'),
]


def diagnose(observation):
    for field, refused in LAYERS:
        value = getattr(observation, field)
        if value is None:
            return 'OBSERVATION_MISSING:' + field
        if value is False:
            return refused
    return 'READ_PATH_OBSERVED_NOT_ORDER_WRITE_PROVEN'


def main():
    ready = Observation(*([True] * 8))
    cases = [
        ('only Azure observed', replace(ready, target_name_resolved=None), 'OBSERVATION_MISSING:target_name_resolved'),
        ('wrong local name', replace(ready, target_name_resolved=False), 'REVIEW_LOCAL_DNS'),
        ('target port not reached', replace(ready, target_tcp_reached=False), 'REVIEW_TARGET_TCP'),
        ('certificate not verified', replace(ready, target_tls_verified=False), 'REVIEW_TARGET_TLS'),
        ('ERP identity refused', replace(ready, erp_identity_accepted=False), 'REVIEW_ERP_IDENTITY'),
        ('ERP API disabled', replace(ready, api_enabled=False), 'REVIEW_ERP_INTERFACE'),
        ('operation permission missing', replace(ready, erp_operation_allowed=False), 'REVIEW_ERP_PERMISSION'),
        ('response does not match', replace(ready, response_matches_contract=False), 'REVIEW_RESPONSE_CONTRACT'),
        ('read path observed', ready, 'READ_PATH_OBSERVED_NOT_ORDER_WRITE_PROVEN'),
    ]
    for label, observation, expected in cases:
        result = diagnose(observation)
        assert result == expected, (label, result)
        print(label + ': ' + result)
    assert diagnose(replace(ready, relay_connected=False)) == 'REVIEW_RELAY_CONNECTION'
    assert diagnose(replace(ready, relay_connected=None)) == 'OBSERVATION_MISSING:relay_connected'
    assert diagnose(replace(ready, target_name_resolved=None, erp_identity_accepted=False)).startswith('OBSERVATION_MISSING:')
    assert ready.relay_connected is True
    assert diagnose(ready) != 'ORDER_IMPORTED'
    assert diagnose(ready) != 'WRITE_ALLOWED'
    assert len(cases) == 9
    print('9 cases and 16 assertions passed. Fictitious observations; no TCP, TLS or ERP call executed.')


if __name__ == '__main__':
    main()
