from .segment import Segment
from ..exceptions.exceptions import FacadeSegmentMutationException


MUTATION_UNSUPPORTED_MESSAGE = 'FacadeSegments cannot be mutated.'


class FacadeSegment(Segment):
    """
    This type of segment should only be used in an AWS Lambda environment.
    It holds the same id, traceid and sampling decision as
    the segment generated by Lambda service but its properties cannot
    be mutated except for its subsegments. If this segment is created
    before Lambda worker finishes initializatioin, all the child
    subsegments will be discarded.
    """
    def __init__(self, name, entityid, traceid, sampled):

        self.initializing = self._is_initializing(
            entityid=entityid,
            traceid=traceid,
            sampled=sampled,
        )

        super(FacadeSegment, self).__init__(
            name=name,
            entityid=entityid,
            traceid=traceid,
            sampled=sampled,
        )

    def close(self, end_time=None):
        """
        Unsupported operation. Will raise an exception.
        """
        raise FacadeSegmentMutationException(MUTATION_UNSUPPORTED_MESSAGE)

    def put_http_meta(self, key, value):
        """
        Unsupported operation. Will raise an exception.
        """
        raise FacadeSegmentMutationException(MUTATION_UNSUPPORTED_MESSAGE)

    def put_annotation(self, key, value):
        """
        Unsupported operation. Will raise an exception.
        """
        raise FacadeSegmentMutationException(MUTATION_UNSUPPORTED_MESSAGE)

    def put_metadata(self, key, value, namespace='default'):
        """
        Unsupported operation. Will raise an exception.
        """
        raise FacadeSegmentMutationException(MUTATION_UNSUPPORTED_MESSAGE)

    def set_aws(self, aws_meta):
        """
        Unsupported operation. Will raise an exception.
        """
        raise FacadeSegmentMutationException(MUTATION_UNSUPPORTED_MESSAGE)

    def set_user(self, user):
        """
        Unsupported operation. Will raise an exception.
        """
        raise FacadeSegmentMutationException(MUTATION_UNSUPPORTED_MESSAGE)

    def add_throttle_flag(self):
        """
        Unsupported operation. Will raise an exception.
        """
        raise FacadeSegmentMutationException(MUTATION_UNSUPPORTED_MESSAGE)

    def add_fault_flag(self):
        """
        Unsupported operation. Will raise an exception.
        """
        raise FacadeSegmentMutationException(MUTATION_UNSUPPORTED_MESSAGE)

    def add_error_flag(self):
        """
        Unsupported operation. Will raise an exception.
        """
        raise FacadeSegmentMutationException(MUTATION_UNSUPPORTED_MESSAGE)

    def add_exception(self, exception, stack, remote=False):
        """
        Unsupported operation. Will raise an exception.
        """
        raise FacadeSegmentMutationException(MUTATION_UNSUPPORTED_MESSAGE)

    def apply_status_code(self, status_code):
        """
        Unsupported operation. Will raise an exception.
        """
        raise FacadeSegmentMutationException(MUTATION_UNSUPPORTED_MESSAGE)

    def serialize(self):
        """
        Unsupported operation. Will raise an exception.
        """
        raise FacadeSegmentMutationException(MUTATION_UNSUPPORTED_MESSAGE)

    def ready_to_send(self):
        """
        Facade segment should never be sent out. This always
        return False.
        """
        return False

    def increment(self):
        """
        Increment total subsegments counter by 1.
        """
        self._subsegments_counter.increment()

    def decrement_ref_counter(self):
        """
        No-op
        """
        pass

    def _is_initializing(self, entityid, traceid, sampled):
        return not entityid or not traceid or sampled is None
