# Copyright (C) 2010-2016 GRNET S.A.
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

"""
Astakos Client Exceptions
"""


class AstakosClientException(Exception):
    """Base AstakosClientException Class"""
    def __init__(self, message='', details='', status=500,
                 response=None, errobject=None):
        self.message = message
        self.details = details
        self.errobject = errobject
        self.response = response
        if not hasattr(self, 'status'):
            self.status = status
        super(AstakosClientException,
              self).__init__(self.message, self.details, self.status)


class ConnectionError(AstakosClientException):
    """Connection failed"""
    def __init__(self, errobject):
        super(ConnectionError, self).__init__(
            message=str(errobject), errobject=errobject)


class BadValue(AstakosClientException):
    """Re-define ValueError Exception under AstakosClientException"""
    def __init__(self, details):
        message = "ValueError"
        super(BadValue, self).__init__(message, details)


class InvalidResponse(AstakosClientException):
    """Return json parse Exception as AstakosClient one"""


class BadRequest(AstakosClientException):
    """BadRequest Exception"""
    status = 400


class Unauthorized(AstakosClientException):
    """Unauthorized Exception"""
    status = 401


class Forbidden(AstakosClientException):
    """Forbidden Exception"""
    status = 403


class NotFound(AstakosClientException):
    """NotFound Exception"""
    status = 404


class QuotaLimit(AstakosClientException):
    """QuotaLimit Exception"""
    status = 413


class NoUserName(AstakosClientException):
    """No display name for the given uuid"""
    def __init__(self, uuid):
        message = "No display name for the given uuid: %s" % uuid
        super(NoUserName, self).__init__(message)


class NoUUID(AstakosClientException):
    """No uuid for the given display name"""
    def __init__(self, display_name):
        message = "No uuid for the given display name: %s" % display_name
        super(NoUUID, self).__init__(message)


class NoEndpoints(AstakosClientException):
    """No endpoints found matching the criteria given"""
    def __init__(self, ep_name, ep_type, ep_region, ep_version_id):
        message = "No endpoints found matching" + \
                  (", name = %s" % ep_name) if ep_name is not None else "" + \
                  (", type = %s" % ep_type) if ep_type is not None else "" + \
                  (", region = %s" % ep_region) \
                  if ep_region is not None else "" + \
                  (", version_id = %s" % ep_version_id) \
                  if ep_version_id is not None else "."
        super(NoEndpoints, self).__init__(message)
