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

# Copyright 2018, IBM.
#
# This source code is licensed under the Apache License, Version 2.0 found in
# the LICENSE.txt file in the root directory of this source tree.

"""Backends provided by IBM Quantum Experience."""
from qiskit._qiskiterror import QISKitError
from .ibmqprovider import IBMQProvider
from .ibmqbackend import IBMQBackend
from .ibmqjob import IBMQJob

# Global instance to be used as the entry point for convenience.
IBMQ = IBMQProvider()


def least_busy(backends):
    """
    Return the least busy available backend for those that
    have a `pending_jobs` in their `status`. Backends such as
    local backends that do not have this are not considered.

    Args:
        backends (list[BaseBackend]): backends to choose from

    Returns:
        BaseBackend: the the least busy backend

    Raises:
        QISKitError: if passing a list of backend names that is
            either empty or none have attribute ``pending_jobs``
    """
    try:
        return min([b for b in backends
                    if b.status()['operational'] and 'pending_jobs' in b.status()],
                   key=lambda b: b.status()['pending_jobs'])
    except (ValueError, TypeError):
        raise QISKitError("Can only find least_busy backend from a non-empty list.")
