#!/usr/bin/env python
# -*- coding: utf-8; -*-

# Copyright (C) 2012, 2013, 2014 Johan Andersson
# Copyright (C) 2013, 2014 Sebastian Wiesner

# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3, or (at your option)
# any later version.

# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.

# You should have received a copy of the GNU General Public License
# along with GNU Emacs; see the file COPYING.  If not, write to the
# Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
# Boston, MA 02110-1301, USA.

"""
Install Cask
"""

from __future__ import unicode_literals, print_function

import os
import sys
import errno
from subprocess import CalledProcessError, check_call


HOME = os.path.expanduser('~')
TARGET_DIRECTORY = os.path.join(HOME, '.cask')
REPOSITORY = 'https://github.com/JJ/cask.git'
ISSUE_TRACKER = 'https://github.com/JJ/cask/issues'


class CaskGoError(Exception):
    pass


OKGREEN = '\033[32m'
FAIL = '\033[31m'
ENDC = '\033[0m'


def success(s):
    print(OKGREEN + s + ENDC)
    sys.exit(0)


def fail(s):
    print(FAIL + s + ENDC, file=sys.stderr)
    sys.exit(1)


def bootstrap_cask(target_directory):
    cask = os.path.join(target_directory, 'bin', 'cask')
    try:
        check_call([sys.executable, cask, 'upgrade-cask'])
    except CalledProcessError:
        raise CaskGoError('Cask could not be bootstrapped. Try again later, '
                          'or report an issue at {0}'.format(ISSUE_TRACKER))


def install_cask(target_directory):
    if os.path.isdir(target_directory):
        raise CaskGoError(
            'Directory {0} exists. Is Cask already installed?'.format(
                target_directory))
    else:
        try:
            check_call(['git', 'clone', REPOSITORY, target_directory])
        except CalledProcessError:
            raise CaskGoError('Cask could not be installed. Try again '
                              'later, or report an issue at {0}'.format(
                                  ISSUE_TRACKER))
        except OSError as error:
            if error.errno == errno.ENOENT:
                raise CaskGoError('git executable not found.  Please install Git')
            else:
                raise


def main():
    try:
        install_cask(TARGET_DIRECTORY)
        bootstrap_cask(TARGET_DIRECTORY)
        success("""\
Successfully installed Cask!  Now, add the cask binary to your $PATH:
  export PATH="{0}/bin:$PATH\"""".format(TARGET_DIRECTORY))
    except CaskGoError as error:
        fail('{0!s}'.format(error))



if __name__ == '__main__':
    sys.exit(main())