"""Run the sampling profiler from the command line."""

import sys

MACOS_PERMISSION_ERROR = """\
🔒 Permission Error: Unable to access process memory on macOS

Tachyon needs elevated permissions to profile processes. Try one of these solutions:

1. Try running again with elevated permissions by running 'sudo -E !!'.

2. If targeting system Python processes:
   Note: Apple's System Integrity Protection (SIP) may block access to system
   Python binaries. Consider using a user-installed Python instead.
"""

LINUX_PERMISSION_ERROR = """
🔒 Tachyon was unable to access process memory. This could be because tachyon
has insufficient privileges (the required capability is CAP_SYS_PTRACE).
Unprivileged processes cannot trace processes that they cannot send signals
to or those running set-user-ID/set-group-ID programs, for security reasons.

If your uid matches the uid of the target process you want to analyze, you
can do one of the following to get 'ptrace' scope permissions:

* If you are running inside a Docker container, you need to make sure you
  start the container using the '--cap-add=SYS_PTRACE' or '--privileged'
  command line arguments. Notice that this may not be enough if you are not
  running as 'root' inside the Docker container as you may need to disable
  hardening (see next points).

* Try running again with elevated permissions by running 'sudo -E !!'.

* You can disable kernel hardening for the current session temporarily (until
  a reboot happens) by running 'echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope'.
"""

WINDOWS_PERMISSION_ERROR = """
🔒 Tachyon requires administrator rights to access process memory on Windows.
Please run your command prompt as Administrator and try again.
"""

GENERIC_PERMISSION_ERROR = """
🔒 Tachyon was unable to access the target process due to operating
system restrictions or missing privileges.
"""

from .cli import main
from .errors import SamplingUnknownProcessError, SamplingModuleNotFoundError, SamplingScriptNotFoundError

def handle_permission_error():
    """Handle PermissionError by displaying appropriate error message."""
    if sys.platform == "darwin":
        print(MACOS_PERMISSION_ERROR, file=sys.stderr)
    elif sys.platform.startswith("linux"):
        print(LINUX_PERMISSION_ERROR, file=sys.stderr)
    elif sys.platform.startswith("win"):
        print(WINDOWS_PERMISSION_ERROR, file=sys.stderr)
    else:
        print(GENERIC_PERMISSION_ERROR, file=sys.stderr)
    sys.exit(1)

if __name__ == '__main__':
    try:
        main()
    except PermissionError:
        handle_permission_error()
    except SamplingUnknownProcessError as err:
        print(f"Tachyon cannot find the process: {err}", file=sys.stderr)
        sys.exit(1)
    except (SamplingModuleNotFoundError, SamplingScriptNotFoundError) as err:
        print(f"Tachyon cannot find the target: {err}", file=sys.stderr)
        sys.exit(1)
