from helpers import Base, SourceElement


class PackageStatement(SourceElement):

    def __init__(self, name, linespan=None, lexspan=None, p=None):
        super(
            PackageStatement,
            self).__init__(
            linespan=linespan,
            lexspan=lexspan,
            p=p)
        self._fields += ['name']
        self.name = name
        Base.p(self.name, self)

    def accept(self, visitor):
        visitor.visit_PackageStatement(self)


class ImportStatement(SourceElement):

    def __init__(self, name, linespan=None, lexspan=None, p=None):
        super(
            ImportStatement,
            self).__init__(
            linespan=linespan,
            lexspan=lexspan,
            p=p)
        self._fields += ['name']
        self.name = name
        Base.p(self.name, self)

    def accept(self, visitor):
        visitor.visit_ImportStatement(self)


class OptionStatement(SourceElement):

    def __init__(self, name, value, linespan=None, lexspan=None, p=None):
        super(
            OptionStatement,
            self).__init__(
            linespan=linespan,
            lexspan=lexspan,
            p=p)
        self._fields += ['name', 'value']
        self.name = name
        Base.p(self.name, self)
        self.value = value
        Base.p(self.value, self)

    def accept(self, visitor):
        visitor.visit_OptionStatement(self)


class FieldDirective(SourceElement):

    def __init__(self, name, value, linespan=None, lexspan=None, p=None):
        super(
            FieldDirective,
            self).__init__(
            linespan=linespan,
            lexspan=lexspan,
            p=p)
        self._fields += ['name', 'value']
        self.name = name
        Base.p(self.name, self)
        self.value = value
        Base.p(self.value, self)

    def accept(self, visitor):
        if visitor.visit_FieldDirective(self):
            self.v(self.name, visitor)
            self.v(self.value, visitor)
            visitor.visit_FieldDirective_post(self)


class FieldType(SourceElement):

    def __init__(self, name, linespan=None, lexspan=None, p=None):
        super(
            FieldType,
            self).__init__(
            linespan=linespan,
            lexspan=lexspan,
            p=p)
        self._fields += ['name']
        self.name = name
        Base.p(self.name, self)

    def accept(self, visitor):
        if visitor.visit_FieldType(self):
            self.v(self.name, visitor)


class LinkDefinition(SourceElement):

    def __init__(
            self,
            link_type,
            src_port,
            name,
            through,
            dst_port,
            linespan=None,
            lexspan=None,
            p=None,
            reverse_id=None):
        super(
            LinkDefinition,
            self).__init__(
            linespan=linespan,
            lexspan=lexspan,
            p=p)
        self._fields += ['link_type', 'src_port',
                         'name', 'dst_port', 'through']
        self.link_type = link_type
        Base.p(self.link_type, self)

        self.src_port = src_port
        Base.p(self.src_port, self)

        self.name = name
        Base.p(self.name, self)

        self.through = through
        Base.p(self.through, self)

        self.dst_port = dst_port
        Base.p(self.dst_port, self)

        self.reverse_id = reverse_id
        Base.p(self.reverse_id, self)

    def accept(self, visitor):
        visitor.visit_LinkDefinition(self)


class FieldDefinition(SourceElement):

    def __init__(
            self,
            field_modifier,
            ftype,
            name,
            policy,
            fieldId,
            fieldDirective,
            linespan=None,
            lexspan=None,
            p=None):
        super(
            FieldDefinition,
            self).__init__(
            linespan=linespan,
            lexspan=lexspan,
            p=p)
        self._fields += ['field_modifier', 'ftype',
                         'name', 'fieldId', 'policy', 'fieldDirective']
        self.name = name
        Base.p(self.name, self)
        self.field_modifier = field_modifier
        Base.p(self.field_modifier, self)
        self.ftype = ftype
        Base.p(self.ftype, self)
        self.fieldId = fieldId
        self.policy = policy
        Base.p(self.policy, self)

        Base.p(self.fieldId, self)
        self.fieldDirective = fieldDirective
        Base.p(self.fieldDirective, self)

    def accept(self, visitor):
        if visitor.visit_FieldDefinition(self):
            self.v(self.name, visitor)
            self.v(self.field_modifier, visitor)
            self.v(self.ftype, visitor)
            self.v(self.fieldId, visitor)
            self.v(self.fieldDirective, visitor)
            visitor.visit_FieldDefinition_post(self)


class EnumFieldDefinition(SourceElement):

    def __init__(self, name, fieldId, linespan=None, lexspan=None, p=None):
        super(
            EnumFieldDefinition,
            self).__init__(
            linespan=linespan,
            lexspan=lexspan,
            p=p)
        self._fields += ['name', 'fieldId']
        self.name = name
        Base.p(self.name, self)
        self.fieldId = fieldId
        Base.p(self.fieldId, self)

    def accept(self, visitor):
        if visitor.visit_EnumFieldDefinition(self):
            self.v(self.name, visitor)
            self.v(self.fieldId, visitor)


class ReduceDefinition(SourceElement):

    def __init__(self, name, body, linespan=None, lexspan=None, p=None):
        super(
            ReduceDefinition,
            self).__init__(
            linespan=linespan,
            lexspan=lexspan,
            p=p)
        self._fields += ['name', 'body']
        self.name = name
        Base.p(self.name, self)
        self.body = body
        Base.p(self.body, self)

    def accept(self, visitor):
        if visitor.visit_EnumDefinition(self):
            self.v(self.name, visitor)
            self.v(self.body, visitor)


class MapDefinition(SourceElement):

    def __init__(self, name, body, linespan=None, lexspan=None, p=None):
        super(
            MapDefinition,
            self).__init__(
            linespan=linespan,
            lexspan=lexspan,
            p=p)
        self._fields += ['name', 'body']
        self.name = name
        Base.p(self.name, self)
        self.body = body
        Base.p(self.body, self)

    def accept(self, visitor):
        if visitor.visit_EnumDefinition(self):
            self.v(self.name, visitor)
            self.v(self.body, visitor)


class PolicyDefinition(SourceElement):

    def __init__(self, name, body, linespan=None, lexspan=None, p=None):
        super(
            PolicyDefinition,
            self).__init__(
            linespan=linespan,
            lexspan=lexspan,
            p=p)
        self._fields += ['name', 'body']
        self.name = name
        Base.p(self.name, self)
        self.body = body
        Base.p(self.body, self)

    def accept(self, visitor):
        if visitor.visit_PolicyDefinition(self):
            self.v(self.name, visitor)
            self.v(self.body, visitor)


class EnumDefinition(SourceElement):

    def __init__(self, name, body, linespan=None, lexspan=None, p=None):
        super(
            EnumDefinition,
            self).__init__(
            linespan=linespan,
            lexspan=lexspan,
            p=p)
        self._fields += ['name', 'body']
        self.name = name
        Base.p(self.name, self)
        self.body = body
        Base.p(self.body, self)

    def accept(self, visitor):
        if visitor.visit_EnumDefinition(self):
            self.v(self.name, visitor)
            self.v(self.body, visitor)


class LinkSpec(SourceElement):

    def __init__(
            self,
            field_spec,
            link_spec,
            linespan=None,
            lexspan=None,
            p=None):
        super(LinkSpec, self).__init__(linespan=linespan, lexspan=lexspan, p=p)
        self._fields += ['link_def', 'field_def']
        self.link_def = link_spec
        Base.p(self.link_def, self)
        self.field_def = field_spec
        Base.p(self.field_def, self)

    def accept(self, visitor):
        if visitor.visit_LinkSpec(self):
            self.v(self.link_def, visitor)
            self.v(self.field_def, visitor)
            visitor.visit_LinkSpec_post(self)


class MessageDefinition(SourceElement):

    def __init__(
            self,
            name,
            policy,
            bases,
            body,
            linespan=None,
            lexspan=None,
            p=None):
        super(
            MessageDefinition,
            self).__init__(
            linespan=linespan,
            lexspan=lexspan,
            p=p)
        self._fields += ['name', 'policy', 'bases', 'body']

        self.name = name
        Base.p(self.name, self)

        self.policy = policy
        Base.p(self.policy, self)

        self.bases = bases
        Base.p(self.bases, self)

        self.body = body
        Base.p(self.body, self)

    def accept(self, visitor):
        if visitor.visit_MessageDefinition(self):
            self.v(self.name, visitor)
            self.v(self.bases, visitor)
            self.v(self.body, visitor)
            visitor.visit_MessageDefinition_post(self)


"""
class MessageDefinition(SourceElement):
    def __init__(self, name, body, linespan=None, lexspan=None, p=None):
        super(MessageDefinition, self).__init__(linespan=linespan, lexspan=lexspan, p=p)
        self._fields += ['name', 'body']
        self.name = name
        Base.p(self.name, self)
        self.body = body
        Base.p(self.body, self)

    def accept(self, visitor):
        if visitor.visit_MessageDefinition(self):
            self.v(self.name, visitor)
            self.v(self.body, visitor)
            visitor.visit_MessageDefinition_post(self)
"""


class MessageExtension(SourceElement):

    def __init__(self, name, body, linespan=None, lexspan=None, p=None):
        super(
            MessageExtension,
            self).__init__(
            linespan=linespan,
            lexspan=lexspan,
            p=p)
        self._fields += ['name', 'body']
        self.name = name
        Base.p(self.name, self)
        self.body = body
        Base.p(self.body, self)

    def accept(self, visitor):
        if visitor.visit_MessageExtension(self):
            self.v(self.name, visitor)
            self.v(self.body, visitor)
            visitor.visit_MessageExtension_post(self)


class MethodDefinition(SourceElement):

    def __init__(
            self,
            name,
            name2,
            name3,
            linespan=None,
            lexspan=None,
            p=None):
        super(
            MethodDefinition,
            self).__init__(
            linespan=linespan,
            lexspan=lexspan,
            p=p)
        self._fields += ['name', 'name2', 'name3']
        self.name = name
        Base.p(self.name, self)
        self.name2 = name2
        Base.p(self.name, self)
        self.name3 = name3
        Base.p(self.name, self)

    def accept(self, visitor):
        if visitor.visit_MethodDefinition(self):
            self.v(self.name, visitor)
            self.v(self.name2, visitor)
            self.v(self.name3, visitor)
            visitor.visit_MethodDefinition_post(self)


class ServiceDefinition(SourceElement):

    def __init__(self, name, body, linespan=None, lexspan=None, p=None):
        super(
            ServiceDefinition,
            self).__init__(
            linespan=linespan,
            lexspan=lexspan,
            p=p)
        self._fields += ['name', 'body']
        self.name = name
        Base.p(self.name, self)
        self.body = body
        Base.p(self.body, self)

    def accept(self, visitor):
        if visitor.visit_ServiceDefinition(self):
            self.v(self.name, visitor)
            self.v(self.body, visitor)
            visitor.visit_ServiceDefinition_post(self)


class ExtensionsMax(SourceElement):
    pass


class ExtensionsDirective(SourceElement):

    def __init__(self, fromVal, toVal, linespan=None, lexspan=None, p=None):
        super(
            ExtensionsDirective,
            self).__init__(
            linespan=linespan,
            lexspan=lexspan,
            p=p)
        self._fields += ['fromVal', 'toVal']
        self.fromVal = fromVal
        Base.p(self.fromVal, self)
        self.toVal = toVal
        Base.p(self.toVal, self)

    def accept(self, visitor):
        if visitor.visit_ExtensionsDirective(self):
            self.v(self.fromVal, visitor)
            self.v(self.toVal, visitor)
            visitor.visit_ExtensionsDirective_post(self)


class Literal(SourceElement):

    def __init__(self, value, linespan=None, lexspan=None, p=None):
        super(Literal, self).__init__(linespan=linespan, lexspan=lexspan, p=p)
        self._fields += ['value']
        self.value = value

    def accept(self, visitor):
        visitor.visit_Literal(self)


class Name(SourceElement):

    def __init__(self, value, linespan=None, lexspan=None, p=None):
        super(Name, self).__init__(linespan=linespan, lexspan=lexspan, p=p)
        self._fields += ['value']
        self.value = value
        self.deriveLex()

    def append_name(self, name):
        try:
            self.value = self.value + '.' + name.value
        except:
            self.value = self.value + '.' + name

    def deriveLex(self):
        if hasattr(self.value, "lexspan"):
            self.lexspan = self.value.lexspan
            self.linespan = self.value.linespan
        else:
            return

    def accept(self, visitor):
        visitor.visit_Name(self)


class DotName(Name):
    elements = []

    def __init__(self, elements, linespan=None, lexspan=None, p=None):
        super(DotName, self).__init__(
            '.'.join([str(x) for x in elements]), linespan=linespan, lexspan=lexspan, p=p)
        self._fields += ['elements']
        self.elements = elements
        self.deriveLex()

    def deriveLex(self):
        if isinstance(self.elements, list) and len(self.elements) > 0:
            self.lexspan = (min([x.lexspan[0] for x in self.elements if x.lexspan[0] != 0]), max(
                [x.lexspan[1] for x in self.elements if x.lexspan[1] != 0]))
            self.linespan = (min([x.linespan[0] for x in self.elements if x.linespan[0] != 0]), max(
                [x.linespan[1] for x in self.elements if x.linespan[1] != 0]))
        elif hasattr(self.elements, "lexspan"):
            self.lexspan = self.elements.lexspan
            self.linespan = self.elements.linespan
        else:
            return

    def accept(self, visitor):
        visitor.visit_DotName(self)


class ProtoFile(SourceElement):

    def __init__(self, body, linespan=None, lexspan=None, p=None):
        super(
            ProtoFile,
            self).__init__(
            linespan=linespan,
            lexspan=lexspan,
            p=p)
        self._fields += ['body']
        self.body = body
        Base.p(self.body, self)

    def accept(self, visitor):
        if visitor.visit_Proto(self):
            self.v(self.body, visitor)
            visitor.visit_Proto_post(self)
