from os.path import exists, join, ismount, abspath, pardir
from hitch import languagestrings
from sys import stderr, exit
import shutil
import os


DOTDIR = ".hitch"


def _check_for_directory():
    checkdirectory = os.getcwd()
    directories_checked = []
    hitch_directory = None

    while not ismount(checkdirectory):
        directories_checked.append(checkdirectory)
        if exists(join(checkdirectory, DOTDIR)):
            hitch_directory = join(checkdirectory, DOTDIR)
            break
        else:
            checkdirectory = abspath(join(checkdirectory, os.pardir))

    return hitch_directory, directories_checked

def hitch_exists_here():
    return exists(DOTDIR)

def hitch_exists():
    directory, _ = _check_for_directory()
    return directory is not None

def get_hitch_directory_or_fail():
    directory, directories_checked = _check_for_directory()
    if not directory:
        stderr.write(languagestrings.HITCH_NOT_INITIALIZED)
        stderr.write('\n'.join(directories_checked))
        stderr.flush()
        exit(1)
    return directory

def remove_hitch_directory_if_exists():
    directory, _ = _check_for_directory()
    if directory is not None:
        shutil.rmtree(directory)

def check_hitch_directory_integrity():
    directory, _ = _check_for_directory()
    if exists(join(directory, "absdir")):
        with open(join(directory, "absdir"), "r") as absdir_handle:
            absdir = absdir_handle.read()
        if directory != absdir:
            stderr.write(languagestrings.HITCH_DIRECTORY_MOVED.format(
                directory, abspath(join(directory, os.pardir))
            ))
            stderr.flush()
            exit(1)
    if not exists(join(get_hitch_directory(), "virtualenv", "bin")):
        stderr.write(languagestrings.SOMETHING_CORRUPTED)
        stderr.flush()
        exit(1)

def get_hitch_directory():
    """Get the full path of the hitch directory."""
    directory, _ = _check_for_directory()
    return directory