"""15-04: 模擬API出力の検証。ネットワーク接続・APIキー・課金なし。"""
import json
import sys


def validate(raw):
    try:
        data = json.loads(raw)
    except (json.JSONDecodeError, TypeError):
        return {'status': '形式不正', 'reason': 'JSONとして解釈できない'}
    if not isinstance(data, dict):
        return {'status': '内容不正', 'reason': 'オブジェクトが必要'}
    if set(data) != {'category', 'summary'}:
        return {'status': '内容不正', 'reason': '項目が不足または余分'}
    if not isinstance(data['category'], str) or data['category'] not in {'billing', 'shipping', 'other'}:
        return {'status': '内容不正', 'reason': '分類が許可値ではない'}
    if not isinstance(data['summary'], str) or not data['summary'].strip():
        return {'status': '内容不正', 'reason': '要約は空でない文字列が必要'}
    if len(data['summary']) > 200:
        return {'status': '内容不正', 'reason': '要約が200文字を超える'}
    # 型が合っても内容の事実確認は別途必要。
    return {'status': '形式採用・内容は人が確認', 'data': data}


SAMPLES = [
    '{"category":"billing","summary":"請求の質問"}',
    '{"category":"unknown","summary":3}',
    '{壊れたJSON',
]


def self_test():
    assert validate(SAMPLES[0])['status'] == '形式採用・内容は人が確認'
    assert validate(SAMPLES[1])['status'] == '内容不正'
    assert validate(SAMPLES[2])['status'] == '形式不正'
    for bad in ['[]', 'null', '{}', '{"category":[],"summary":"x"}', '{"category":"other","summary":3}', '{"category":"other","summary":" "}']:
        assert validate(bad)['status'] == '内容不正'
    assert validate(json.dumps({'category':'other','summary':'x'*201}))['status'] == '内容不正'
    assert validate(json.dumps({'category':'other','summary':'x','extra':1}))['status'] == '内容不正'
    print('PASS: 正常・不正JSON・型・必須項目・許可値・長さを確認。')


if __name__ == '__main__':
    if '--self-test' in sys.argv:
        self_test()
    else:
        for n, sample in enumerate(SAMPLES, 1):
            print(n, json.dumps(validate(sample), ensure_ascii=False))
