import os
import sys
import subprocess
from contextlib import contextmanager


def start(path):
    """
    Open a file with the OS's default program. (Cross-platform equivalent of os.startfile() for
    Windows)
    """

    if not os.path.isfile(path):
        raise(IOError, "No such file: '%s'" % path)

    if sys.platform == 'darwin':
        subprocess.Popen(['open', path])
    elif os.name == 'posix':
        subprocess.Popen(['xdg-open', path])
    elif sys.platform == 'win32':
        os.startfile(path)

def reveal(path):
    """
    Reveal a file in file browser.
    """

    if not os.path.isfile(path):
        raise(IOError, "No such file: '%s'" % path)

    if sys.platform == 'darwin':
        subprocess.Popen(['open', '-R', path])
    elif os.name == 'posix':
        # No easy way to reveal specific files on Linux, so just open the containing directory
        subprocess.Popen(['xdg-open', os.path.dirname(path)])
    elif sys.platform == 'win32':
        subprocess.Popen(['explorer', '/select', path])


@contextmanager
def get_read_handle(path):
    """
    Get os independent read handle for a file
    """

    if os.name == "nt":
        file_mode = 'rb'
    else:
        file_mode = 'r'
    read_handle = open(path, file_mode)
    yield read_handle
    read_handle.close()