from .effector import Effector

class AllowOverrideEffector(Effector):

    def intermediate_effect(self, effects):
        """ returns a intermediate effect based on the matched effects of the enforcer """
        if Effector.ALLOW in effects:
            return Effector.ALLOW
        return Effector.INDETERMINATE

    def final_effect(self, effects):
        """ returns the final effect based on the matched effects of the enforcer """
        if Effector.ALLOW in effects:
            return Effector.ALLOW
        return Effector.DENY

class DenyOverrideEffector(Effector):

    def intermediate_effect(self, effects):
        """ returns a intermediate effect based on the matched effects of the enforcer """
        if Effector.DENY in effects:
            return Effector.DENY
        return Effector.INDETERMINATE

    def final_effect(self, effects):
        """ returns the final effect based on the matched effects of the enforcer """
        if Effector.DENY in effects:
            return Effector.DENY
        return Effector.ALLOW

class AllowAndDenyEffector(Effector):

    def intermediate_effect(self, effects):
        """ returns a intermediate effect based on the matched effects of the enforcer """
        if Effector.DENY in effects:
            return Effector.DENY
        return Effector.INDETERMINATE

    def final_effect(self, effects):
        """ returns the final effect based on the matched effects of the enforcer """
        if Effector.DENY in effects or Effector.ALLOW not in effects:
            return Effector.DENY
        return Effector.ALLOW

class PriorityEffector(Effector):

    def intermediate_effect(self, effects):
        """ returns a intermediate effect based on the matched effects of the enforcer """
        if Effector.ALLOW in effects:
            return Effector.ALLOW
        if Effector.DENY in effects:
            return Effector.DENY
        return Effector.INDETERMINATE

    def final_effect(self, effects):
        """ returns the final effect based on the matched effects of the enforcer """
        if Effector.ALLOW in effects:
            return Effector.ALLOW
        if Effector.DENY in effects:
            return Effector.DENY
        return Effector.DENY
