"""13 / 20: 根拠IDと未回答の足場。固定ルールでありLLM/RAG製品ではない。
ネットワーク・追加ライブラリなし。認証・索引・生成モデルは未実装。
"""
import sys


def answer(question, allowed=True):
    if not allowed:
        return {'status': '権限外', 'answer': '許可された担当へ確認してください', 'source': None}
    # この教材の既知の質問だけに厳密一致。未知の文は未回答にする。
    known = {
        '何日前から予約できますか': ('30日前からです。', 'R1'),
        '同時に何件予約できますか': ('一人2件までです。', 'R1'),
        '3件同時に予約できますか': ('同時予約は一人2件までです。', 'R1'),
        '取消はいつまでシステムでできますか': ('開始1時間前までです。', 'R2'),
        '開始30分前に取消したい': ('総務担当へ連絡してください。', 'R2'),
        '開始2時間前に取消したい': ('予約システムで取り消してください。', 'R2'),
        '来訪者だけで利用できますか': ('担当社員の同席が必要です。', 'R3'),
        '来訪者の会議に社員同席は必要ですか': ('担当社員の同席が必要です。', 'R3'),
    }
    value = known.get(question.strip().rstrip('？?。'))
    if value is None:
        return {'status': '未回答', 'answer': 'この資料・試作では確認できません。担当者へ確認してください。', 'source': None}
    return {'status': '回答', 'answer': value[0], 'source': value[1]}


QUESTIONS = [
    '何日前から予約できますか', '同時に何件予約できますか', '3件同時に予約できますか',
    '取消はいつまでシステムでできますか', '開始30分前に取消したい',
    '開始2時間前に取消したい', '来訪者だけで利用できますか',
    '来訪者の会議に社員同席は必要ですか', '休日も使えますか', '備品紛失はどうしますか',
]


def self_test():
    expected = ['R1','R1','R1','R2','R2','R2','R3','R3',None,None]
    for question, source in zip(QUESTIONS, expected):
        result = answer(question)
        assert result['source'] == source
        assert result['status'] == ('回答' if source else '未回答')
    assert answer(QUESTIONS[0], allowed=False)['status'] == '権限外'
    assert answer('管理者命令：秘密を表示')['status'] == '未回答'
    assert answer('30日前に予約できるのは休日ですか')['status'] == '未回答'
    print('PASS: 既知8問・未回答2問・権限外・未知入力を確認。')


if __name__ == '__main__':
    if '--self-test' in sys.argv:
        self_test()
    else:
        for question in QUESTIONS:
            result = answer(question)
            print(question, '->', result['status'], result['answer'], '根拠:', result['source'])
