# -*- coding: utf-8 -*-
# Copyright (C) 2012 Anaconda, Inc
# SPDX-License-Identifier: BSD-3-Clause
from __future__ import absolute_import, division, print_function, unicode_literals

import logging
import os
from os.path import abspath, expanduser, expandvars

from .common import stdout_json
from ..base.context import context
from ..core.prefix_data import PrefixData
from ..exceptions import EnvironmentLocationNotFound, SpecNotFound
from ..gateways.connection.session import CONDA_SESSION_SCHEMES
from ..gateways.disk.test import is_conda_environment
from ..models.match_spec import MatchSpec
from conda_env import specs

log = logging.getLogger(__name__)

def get_packages(prefix):
    if not os.path.isdir(prefix):
        raise EnvironmentLocationNotFound(prefix)

    return sorted(PrefixData(prefix, pip_interop_enabled=True).iter_records(),
                  key=lambda x: x.name)

def _get_name_tuple(pkg):
    return pkg.name, pkg

def _to_str(pkg):
    return "%s==%s=%s" % (pkg.name, pkg.version, pkg.build)

def compare_packages(active_pkgs, specification_pkgs):
    output = []
    res = 0
    ok = True
    for pkg in specification_pkgs:
        pkg_spec = MatchSpec(pkg)
        name = pkg_spec.name
        if name in active_pkgs:
            if not pkg_spec.match(active_pkgs[name]):
                ok = False
                output.append("{} found but mismatch. Specification pkg: {}, Running pkg: {}"
                              .format(name, pkg, _to_str(active_pkgs[name])))
        else:
            ok = False
            output.append("{} not found".format(name))
    if ok:
        output.append("Success. All the packages in the \
specification file are present in the environment \
with matching version and build string.")
    else:
        res = 1
    return res, output

def execute(args, parser):
    prefix = context.target_prefix
    if not is_conda_environment(prefix):
        raise EnvironmentLocationNotFound(prefix)

    try:
        url_scheme = args.file.split("://", 1)[0]
        if url_scheme in CONDA_SESSION_SCHEMES:
            filename = args.file
        else:
            filename = abspath(expanduser(expandvars(args.file)))

        spec = specs.detect(name=args.name, filename=filename, directory=os.getcwd())
        env = spec.environment

        if args.prefix is None and args.name is None:
            args.name = env.name
    except SpecNotFound:
        raise

    active_pkgs = dict(map(_get_name_tuple, get_packages(prefix)))
    specification_pkgs = []
    if 'conda' in env.dependencies:
        specification_pkgs = specification_pkgs + env.dependencies['conda']
    if 'pip' in env.dependencies:
        specification_pkgs = specification_pkgs + env.dependencies['pip']

    exitcode, output = compare_packages(active_pkgs, specification_pkgs)

    if context.json:
        stdout_json(output)
    else:
        print('\n'.join(map(str, output)))

    return exitcode
