# -*- coding: UTF-8 -*-
# FILE: features/environment.py
# pylint: disable=unused-argument
"""
Functionality:

  * active tags
"""

from __future__ import print_function
import sys
import platform
import os.path
import six
from behave.tag_matcher import ActiveTagMatcher
from behave4cmd0.setup_command_shell import setup_command_shell_processors4behave
# PREPARED:
# from behave.tag_matcher import setup_active_tag_values


def require_tool(tool_name):
    """Check if a tool (an executable program) is provided on this platform.

    :params tool_name:  Name of the tool to check if it is available.
    :return: True, if tool is found.
    :return: False, if tool is not available (or not in search path).
    """
    # print("CHECK-TOOL: %s" % tool_name)
    path = os.environ.get("PATH")
    if not path:
        return False

    for searchdir in path.split(os.pathsep):
        executable1 = os.path.normpath(os.path.join(searchdir, tool_name))
        executables = [executable1]
        if sys.platform.startswith("win"):
            executables.append(executable1 + ".exe")

        for executable in executables:
            # print("TOOL-CHECK: %s" % os.path.abspath(executable))
            if os.path.isfile(executable):
                # print("TOOL-FOUND: %s" % os.path.abspath(executable))
                return True
    # -- OTHERWISE: Tool not found
    # print("TOOL-NOT-FOUND: %s" % tool_name)
    return False

def as_bool_string(value):
    if bool(value):
        return "yes"
    else:
        return "no"

def discover_ci_server():
    # pylint: disable=invalid-name
    ci_server = "none"
    CI = os.environ.get("CI", "false").lower() == "true"
    APPVEYOR = os.environ.get("APPVEYOR", "false").lower() == "true"
    TRAVIS = os.environ.get("TRAVIS", "false").lower() == "true"
    if CI:
        if APPVEYOR:
            ci_server = "appveyor"
        elif TRAVIS:
            ci_server = "travis"
        else:
            ci_server = "unknown"
    return ci_server


# -- MATCHES ANY TAGS: @use.with_{category}={value}
# NOTE: active_tag_value_provider provides category values for active tags.
active_tag_value_provider = {
    "python2": str(six.PY2).lower(),
    "python3": str(six.PY3).lower(),
    # -- python.implementation: cpython, pypy, jython, ironpython
    "python.implementation": platform.python_implementation().lower(),
    "pypy":    str("__pypy__" in sys.modules).lower(),
    "os":      sys.platform,
    "xmllint": as_bool_string(require_tool("xmllint")),
    "ci": discover_ci_server()
}
active_tag_matcher = ActiveTagMatcher(active_tag_value_provider)

def before_all(context):
    # -- SETUP ACTIVE-TAG MATCHER (with userdata):
    # USE: behave -D browser=safari ...
    # NOT-NEEDED: setup_active_tag_values(active_tag_value_provider,
    #                                     context.config.userdata)
    setup_command_shell_processors4behave()

def before_feature(context, feature):
    if active_tag_matcher.should_exclude_with(feature.tags):
        feature.skip(reason=active_tag_matcher.exclude_reason)

def before_scenario(context, scenario):
    if active_tag_matcher.should_exclude_with(scenario.effective_tags):
        scenario.skip(reason=active_tag_matcher.exclude_reason)