from .EntityTypeDesc import EntityTypeDesc
from toontown.coghq.SpecImports import *

class Entity(EntityTypeDesc):
    abstract = 1
    type = 'entity'
    attribs = (('type', None, 'const'),
     ('name', '<unnamed>', 'string'),
     ('comment', '', 'string'),
     ('parentEntId', 0, 'entId'))


class LevelMgr(Entity):
    type = 'levelMgr'
    permanent = 1
    attribs = (('name', 'LevelMgr', 'const'), ('parentEntId', 0, 'const'), ('modelFilename', '', 'const'))


class EditMgr(Entity):
    type = 'editMgr'
    permanent = 1
    blockAttribs = ('comment',)
    attribs = (('name', 'LevelMgr', 'const'),
     ('parentEntId', 0, 'const'),
     ('requestSave', None, 'const'),
     ('requestNewEntity', None, 'const'),
     ('insertEntity', None, 'const'),
     ('removeEntity', None, 'const'))


class AttribModifier(Entity):
    type = 'attribModifier'
    attribs = (('recursive', 0, 'bool'),
     ('typeName', '', 'string'),
     ('attribName', '', 'string'),
     ('value', '', 'string'))


class Locator(Entity):
    type = 'locator'
    attribs = (('searchPath', '', 'string'),)


class Nodepath(Entity):
    type = 'nodepath'
    attribs = (('parentEntId',
      0,
      'entId',
      {'type': 'nodepath'}),
     ('pos', Point3(0, 0, 0), 'pos'),
     ('hpr', Vec3(0, 0, 0), 'hpr'),
     ('scale', 1, 'scale'))


class Zone(Nodepath):
    type = 'zone'
    permanent = 1
    blockAttribs = ('pos', 'hpr')
    attribs = (('parentEntId', 0, 'const'), ('description', '', 'string'), ('visibility', [], 'visZoneList'))


class EntrancePoint(Nodepath):
    type = 'entrancePoint'
    attribs = (('entranceId', -1, 'int'), ('radius',
      15,
      'float',
      {'min': 0}), ('theta',
      20,
      'float',
      {'min': 0}))


class LogicGate(Entity):
    type = 'logicGate'
    output = 'bool'
    attribs = (('input1Event',
      0,
      'entId',
      {'output': 'bool'}),
     ('input2Event',
      0,
      'entId',
      {'output': 'bool'}),
     ('isInput1', 0, 'bool'),
     ('isInput2', 0, 'bool'),
     ('logicType',
      'or',
      'choice',
      {'choiceSet': ['or',
                     'and',
                     'xor',
                     'nand',
                     'nor',
                     'xnor']}))


class CutScene(Entity):
    type = 'cutScene'
    output = 'bool'
    attribs = (('pos', Point3(0, 0, 0), 'pos'),
     ('hpr', Vec3(0, 0, 0), 'hpr'),
     ('startStopEvent',
      0,
      'entId',
      {'output': 'bool'}),
     ('effect',
      'irisInOut',
      'choice',
      {'choiceSet': ['nothing', 'irisInOut', 'letterBox']}),
     ('motion',
      'foo1',
      'choice',
      {'choiceSet': ['foo1']}),
     ('duration', 5.0, 'float'))


class CollisionSolid(Nodepath):
    type = 'collisionSolid'
    attribs = (('solidType',
      'sphere',
      'choice',
      {'choiceSet': ['sphere', 'tube']}),
     ('radius', 1.0, 'float'),
     ('length', 0.0, 'float'),
     ('showSolid', 0, 'bool'))


class Model(Nodepath):
    type = 'model'
    attribs = (('loadType',
      'loadModelCopy',
      'choice',
      {'choiceSet': ['loadModelCopy', 'loadModel', 'loadModelOnce']}),
     ('modelPath', None, 'bamfilename'),
     ('flattenType',
      'light',
      'choice',
      {'choiceSet': ['none',
                     'light',
                     'medium',
                     'strong']}),
     ('collisionsOnly', 0, 'bool'),
     ('goonHatType',
      'none',
      'choice',
      {'choiceSet': ['none', 'hardhat', 'security']}))


class Path(Nodepath):
    type = 'path'
    attribs = (('pathIndex', 0, 'int'), ('pathScale', 1.0, 'float'))


class VisibilityExtender(Entity):
    type = 'visibilityExtender'
    attribs = (('event',
      None,
      'entId',
      {'output': 'bool'}), ('newZones', [], 'visZoneList'))


class AmbientSound(Nodepath):
    type = 'ambientSound'
    attribs = (('soundPath', '', 'bamfilename'), ('volume',
      1,
      'float',
      {'min': 0,
       'max': 1}), ('enabled', 1, 'bool'))


class PropSpinner(Entity):
    type = 'propSpinner'


class EntityGroup(Entity):
    type = 'entityGroup'