"""Teaching PreToolUse guard for Edit/Write; not an OS-wide write boundary."""

import json
import os
import sys
from pathlib import Path


def deny(reason):
    print('WRITE_DENIED: ' + reason, file=sys.stderr)
    return 2


def main():
    try:
        payload = json.load(sys.stdin)
        if not isinstance(payload, dict) or payload.get('hook_event_name') != 'PreToolUse':
            return deny('expected a PreToolUse object')
        tool = payload.get('tool_name')
        if not isinstance(tool, str):
            return deny('missing tool_name')
        if tool not in {'Edit', 'Write'}:
            return 0
        project = os.environ.get('CLAUDE_PROJECT_DIR')
        if not project:
            return deny('CLAUDE_PROJECT_DIR is required')
        root = Path(project).resolve()
        tool_input = payload.get('tool_input')
        if not isinstance(tool_input, dict):
            return deny('missing tool_input')
        file_path = tool_input.get('file_path')
        if not isinstance(file_path, str) or not file_path.strip() or '\x00' in file_path:
            return deny('missing or invalid file_path')
        cwd = payload.get('cwd', str(root))
        if not isinstance(cwd, str) or not Path(cwd).is_absolute():
            return deny('cwd must be absolute')
        target = Path(file_path)
        if not target.is_absolute():
            target = Path(cwd) / target
        target = target.resolve()
        if not target.is_relative_to(root):
            return deny('target is outside the teaching project')
        if target.is_relative_to((root / 'protected').resolve()):
            return deny('protected directory is read-only')
        return 0
    except (ValueError, OSError, TypeError):
        return deny('invalid hook input')


if __name__ == '__main__':
    sys.exit(main())
