# Copyright (c) Facebook, Inc. and its affiliates.

# This source code is licensed under the MIT license found in the
# LICENSE file in the root directory of this source tree.

from __future__ import absolute_import, division, print_function, unicode_literals

from wadebug.config import Config


class Result:
    def to_dict(self):
        ret = {
            "class": self.action.__name__,
            "user_facing_name": self.action.user_facing_name,
            "result": self.result,
            "short_description": self.action.short_description,
            "message": self.message,
            "details": self.details,
            "remediation": self.remediation,
        }

        if Config().development_mode and hasattr(self, "traceback"):
            ret["traceback"] = self.traceback

        return ret

    @property
    def result(self):
        """String value of the result."""
        return self.__class__.__name__.lower()


class OK(Result):
    def to_dict(self):
        return {
            "class": self.action.__name__,
            "user_facing_name": self.action.user_facing_name,
            "result": self.__class__.__name__,
        }

    def __init__(self, action):
        self.action = action


class _NotOK(Result):
    """Intermediate class to create cases where something is wrong."""

    def __init__(self, action, message, details, remediation, traceback=None):
        self.action = action
        self.message = message
        if isinstance(details, Exception):
            self.details = str(details)
            self.traceback = traceback
        else:
            self.details = details
        self.remediation = remediation


class Warning(_NotOK):
    pass


class Skipped(_NotOK):
    pass


class Problem(_NotOK):
    pass


class WADebugError(_NotOK):
    @property
    def result(self):
        return "wadebug_error"
