# -*- coding: utf-8 -*-

import getopt
import json
import os
import platform
import sys

from builder.core.env import env
import builder.core.colorconsole as cc
import builder.core.utils as utils
from builder.core.context import *

if env.is_py2:
    _input = raw_input
else:
    _input = input

options = list()
options_idx = 0
ctx = BuildContext()


def main():
    cc.set_default(sep='', end='\n')

    if not env.init(warn_miss_tool=True):
        return

    action = None
    argv = sys.argv[1:]
    if len(argv) >= 1:
        for i in range(len(argv)):
            if 'debug' == argv[i]:
                ctx.set_target(TARGET_DEBUG)
            elif 'release' == argv[i]:
                ctx.set_target(TARGET_RELEASE)
            elif argv[i] in ctx.dist_all:
                ctx.set_dist(argv[i])
            else:
                action = argv[i]

    make_options()

    if action is not None:
        cc.v(action)
        opt = select_option_by_name(action)
        if opt is None:
            cc.e('unknown config: ', action)
            return

        do_opt(opt)
        return

    show_logo()
    while True:
        x = show_menu()
        if x == 'q':
            break

        if x == 'c':
            clean_all()
            continue

        try:
            x = int(x)
        except:
            cc.e('invalid input.')
            continue

        opt = select_option_by_id(int(x))
        if 'config' == opt['name']:
            if make_config():
                make_options()
            continue

        if opt is None:
            cc.e('unknown selection: ', x)
            continue

        do_opt(opt)

        cc.w('\ntask finished, press Enter to continue or Q to quit...', end='')
        try:
            x = _input()
        except EOFError:
            x = 'q'
        if x == 'q':
            break


def clean_all():
    cc.v('remove compiler out path...')
    utils.remove(os.path.join(ROOT_PATH, 'out'))


def do_opt(opt):
    arg = ''

    if 'ver' == opt['name']:
        script = 'build-version.py'

    elif 'pysrt' == opt['name']:
        script = 'build-pysrt.py'

    elif 'external' == opt['name']:
        script = 'build-external.py'

    elif 'server' == opt['name']:
        script = 'build-server.py'
        arg = '%s %s server' % (ctx.target_path, opt['bits'])

    elif 'installer' == opt['name']:
        script = 'build-installer.py'
        # arg = 'installer'
        arg = '%s %s installer' % (ctx.dist, opt['bits'])

    elif 'assist-exe' == opt['name']:
        script = 'build-assist.py'
        arg = '%s %s exe' % (ctx.target_path, opt['bits'])
    # elif 'assist-rdp' == opt['name']:
    #     script = 'build-assist.py'
    #     arg = '%s rdp' % (opt['bits'])
    elif 'assist-installer' == opt['name']:
        script = 'build-assist.py'
        arg = '%s %s installer' % (ctx.dist, opt['bits'])

    else:
        cc.e('unknown option: ', opt['name'])
        return

    # cmd = '"%s" -B "%s" %s' % (utils.cfg.py_exec, os.path.join(BUILDER_PATH, script), arg)
    cmd = '%s -B %s %s' % (utils.cfg.py_exec, os.path.join(env.builder_path, script), arg)
    os.system(cmd)


def select_option_by_name(name):
    global options

    for o in range(len(options)):
        if options[o] is None:
            continue

        if name == options[o]['name']:
            return options[o]

    return None


def select_option_by_id(_id):
    global options

    for o in range(len(options)):
        if options[o] is None:
            continue
        if options[o]['id'] == _id:
            return options[o]
    return None


def add_option(bits, name, disp):
    global options, options_idx
    options_idx += 1
    # if bits is not None:
    #     disp = '[%s] %s' % (bits, disp)
    options.append({'id': options_idx, 'name': name, 'disp': disp, 'bits': bits})


def add_split():
    global options
    options.append(None)


def make_options():
    # global options, options_idx
    #
    # options = list()
    # options_idx = 0

    if ctx.host_os == 'windows':
        add_option('x86', 'ver', 'Update version setting')
        add_option('x86', 'pysrt', 'Make Python-Runtime for python%s-x86' % env.py_ver_str)
        add_option('x64', 'external', 'Build external dependency')
        add_split()
        add_option('x86', 'assist-exe', 'Assist Execute [%s]' % ctx.target_path)
        # add_option('x86', 'assist-rdp', 'Teleport RDP [%s]' % ctx.target_path)
        add_option('x86', 'assist-installer', 'Assist Installer')
        add_split()
        add_option('x86', 'server', 'Teleport Server [%s]' % ctx.target_path)
        add_split()
        add_option('x86', 'installer', 'Teleport Installer for %s' % ctx.host_os)
    else:
        add_option('x64', 'ver', 'Update version setting')
        add_option('x64', 'pysrt', 'Make Python-Runtime for python%s-x64' % env.py_ver_str)
        add_option('x64', 'external', 'Build external dependency')
        add_split()
        add_option('x64', 'server', 'Build server app [%s]' % ctx.target_path)
        add_split()
        add_option('x64', 'installer', 'Make server installer for %s' % ctx.host_os)


def get_input(msg, log_func=cc.w):
    log_func(msg, end=' ')
    try:
        return _input()
    except EOFError:
        return ''


def show_logo():
    cc.v('[]=======================================================[]')
    cc.o((cc.CR_VERBOSE, ' | '), (cc.CR_INFO, 'Teleport Projects Builder'), (cc.CR_VERBOSE, '                             |'))
    cc.v(' | auth: apexliu@eomsoft.net                             |')
    cc.v('[]=======================================================[]')


def show_menu():
    cc.v('')
    cc.v('=========================================================')
    for o in range(len(options)):
        if options[o] is None:
            cc.v('  -------------------------------------------------------')
            continue
        cc.o((cc.CR_NORMAL, '  ['), (cc.CR_INFO, '%2d' % options[o]['id']), (cc.CR_NORMAL, '] ', options[o]['disp']))

    cc.v('  -------------------------------------------------------')
    cc.o((cc.CR_NORMAL, '  ['), (cc.CR_INFO, ' C'), (cc.CR_NORMAL, '] clean build and dist env.'))

    cc.v('  -------------------------------------------------------')
    cc.o((cc.CR_NORMAL, '  ['), (cc.CR_INFO, ' Q'), (cc.CR_NORMAL, '] exit'))

    cc.w('\nselect action: ', end='')
    try:
        x = _input()
    except EOFError:
        x = 'q'

    cc.n('')
    return x.lower()


if __name__ == '__main__':
    try:
        main()
    except KeyboardInterrupt:
        pass
    except RuntimeError as e:
        cc.e(e.__str__())
    except:
        cc.f('got exception.')