import os
import sys
import posixpath
import json
import socket
from . import termui
import click
import requests
import signal
from requests.packages.urllib3.exceptions import InsecureRequestWarning
try:
    from urllib.parse import urlparse
except ImportError:
    from urlparse import urlparse


version = '0.3.2'

WIO_LINK_V1_0 = 'Wio Link v1.0'
WIO_NODE_V1_0 = 'Wio Node v1.0'
boards = [WIO_LINK_V1_0, WIO_NODE_V1_0]

login_endpoint = "/v1/user/login"
ext_user_endpoint = "/v1/ext_users"
node_list_endpoint = "/v1/nodes/list"
well_known_endpoint = "/v1/node/.well-known"
nodes_create_endpoint = "/v1/nodes/create"
nodes_rename_endpoint = "/v1/nodes/rename"
nodes_delete_endpoint = "/v1/nodes/delete"
node_resources_endpoint = "/v1/node/resources"

verify = False

CONTEXT_SETTINGS = dict(auto_envvar_prefix='WIO')

class Wio(object):

    def __init__(self):
        # self.home = home
        self.config = {}
        # self.verbose = False

    def set_config(self, key, value):
        self.config[key] = value
        # cur_dir = os.path.split(os.path.realpath(__file__))[0]
        cur_dir = os.path.abspath(os.path.expanduser("~/.wio"))
        db_file_path = '%s/config.json' % cur_dir
        open("%s/config.json"%cur_dir,"w").write(json.dumps(self.config))
        # if self.verbose:
        #     click.echo('config[%s] = %s' % (key, value), file=sys.stderr)


pass_wio = click.make_pass_decorator(Wio, ensure=True)
cmd_folder = os.path.abspath(os.path.join(os.path.dirname(__file__),'commands'))


class ComplexCLI(click.MultiCommand):

    def list_commands(self, ctx):
        rv = []
        for filename in os.listdir(cmd_folder):
            if filename.endswith('.py') and \
               filename.startswith('cmd_'):
                rv.append(filename[4:-3])
        rv.sort()
        return rv

    def get_command(self, ctx, name):
        try:
            if sys.version_info[0] == 2:
                name = name.encode('ascii', 'replace')
            mod = __import__('wio.commands.cmd_' + name,
                             None, None, ['cli'])
        except ImportError:
            return
        return mod.cli


def sigint_handler(signum, frame):
    click.echo()
    exit(0)

@click.command(cls=ComplexCLI, context_settings=CONTEXT_SETTINGS)
@click.version_option(version)
@click.pass_context
def cli(ctx):
    """\b
    Welcome to the Wio Command line utility!
    https://github.com/Seeed-Studio/wio-cli

    For more information Run: wio <command_name> --help
    """
    ctx.obj = Wio()
    cur_dir = os.path.abspath(os.path.expanduser("~/.wio"))
    if not os.path.exists(cur_dir):
        text = {"email":"", "token":""}
        os.mkdir(cur_dir)
        open("%s/config.json"%cur_dir,"w").write(json.dumps(text))
    db_file_path = '%s/config.json' % cur_dir
    config = json.load(open(db_file_path))
    ctx.obj.config = config

    signal.signal(signal.SIGINT, sigint_handler)

    if not verify:
        requests.packages.urllib3.disable_warnings(InsecureRequestWarning)

def choise_server(wio):
    while True:
        click.echo("1.) Global Server (New)[https://us.wio.seeed.io]")
        # click.echo("2.) Global Server (Old)[https://iot.seeed.cc]")
        click.echo("2.) Chinese Server [https://cn.wio.seeed.io]")
        click.echo("3.) Customize Server")
        click.secho('? ', fg='green', nl=False)
        server = click.prompt(click.style('Please choice server', bold=True), type=int)
        if server == 1:
            wio.set_config("mserver","https://us.wio.seeed.io")
            wio.set_config("server","Global")
            wio.set_config("mserver_ip","54.186.73.152")
            return
        # elif server == 2:
        #     wio.set_config("mserver","https://iot.seeed.cc")
        #     wio.set_config("server","Global")
        #     wio.set_config("mserver_ip","45.79.4.239")
        #     return
        elif server == 2:
            wio.set_config("mserver","https://cn.wio.seeed.io")
            wio.set_config("server","Chinese")
            wio.set_config("mserver_ip","120.25.216.117")
            return
        elif server == 3:
            wio.set_config("server","Customize")
            break
        else:
            click.echo(click.style('>> ', fg='red') + "invalid input.")
            continue

    while 1:
        click.secho('? ', fg='green', nl=False)
        mserver = click.prompt(click.style("Please enter Customize Server url\n(e.g. https://us.wio.seeed.io or http://192.168.1.10:8080)", bold=True))
        try:
            hostname = urlparse(mserver).hostname
            mserver_ip = socket.gethostbyname(hostname)
            break
        except (IndexError, TypeError):
            click.secho(">> url is not correct format!", fg='red')
            continue
        except Exception as e:
            click.secho(">> %s" %e, fg='red')
            continue

    wio.set_config("mserver", mserver)
    wio.set_config("mserver_ip", mserver_ip)