"""Read-only diagnostic; paths and traceback are shown only with --show-paths."""
import argparse
import json
import os
import platform
import struct
import sys
import traceback

import resolve_api_connection as bridge


def diagnose(show_paths=False):
    report = {
        "status": "not_checked",
        "stage": "environment",
        "python": platform.python_version(),
        "platform": sys.platform,
        "pointer_bits": struct.calcsize("P") * 8,
        "configured_variables": [key for key in ("RESOLVE_SCRIPT_API", "RESOLVE_SCRIPT_LIB") if key in os.environ],
    }
    if show_paths:
        report["python_executable"] = sys.executable
    try:
        report["stage"] = "module"
        if show_paths:
            report["module_file"] = str(bridge.module_file())
        module = bridge.load_resolve_module()
        report["stage"] = "connection"
        resolve = module.scriptapp("Resolve")
        if not resolve:
            raise bridge.ResolveConnectionError("No Resolve object")
        report["product"] = resolve.GetProductName()
        report["version"] = resolve.GetVersionString()
        if not report["product"] or not report["version"]:
            raise bridge.ResolveConnectionError("Application identity unavailable")
        report["stage"] = "project_manager"
        manager = bridge.project_manager(resolve)
        report["stage"] = "current_project"
        project = manager.GetCurrentProject()
        report["project_open"] = bool(project)
        report["timeline_open"] = bool(project.GetCurrentTimeline()) if project else False
        report["status"] = "read_access_available"
        # No project/timeline is a valid empty state, not a broken connection.
        report["stage"] = "complete"
    except Exception as exc:
        report["status"] = "failed"
        report["exception_type"] = type(exc).__name__
        report["cause_type"] = type(exc.__cause__).__name__ if exc.__cause__ else None
        report["next_step"] = "Inspect this stage locally; do not change permissions to Network as a generic fix."
        if show_paths:
            report["traceback"] = traceback.format_exc()
    return report


def main(argv=None):
    parser = argparse.ArgumentParser(description=__doc__)
    parser.add_argument("--show-paths", action="store_true", help="Include local paths/traceback; redact before sharing")
    args = parser.parse_args(argv)
    report = diagnose(args.show_paths)
    print(json.dumps(report, ensure_ascii=False, indent=2))
    return 0 if report["status"] == "read_access_available" else 1


if __name__ == "__main__":
    raise SystemExit(main())
