from django.db import models
from django.contrib.auth.models import User
TIPOS_DANO = ( ('M','Magico'),('C','Corporal'))
TIPOS_ARMA = ( ('H','Hacha'),('P','Palo'),('E','Espada'),('A','Arco'),('D','Daga'),('B','Baston'))
TIPOS_PERSONAJES = ( ('M','Mago'),('G','Guerrero'), ('A','Arquero') )
TIPOS_HABILIDADES = (('H','Hechizo' ), ('G','Golpe'),('E','Movimiento_Especial'))
TIPOS_ESTADO_CELDA = ( ('N','NPC'),('J','Jugador'),('B','Bloqueada'),('V','Vacia'))
TIPOS_ESTADO_PERSONAJE = ( ('A','Atacando'), ('P','Pasivo'), ('R','Recuperandose-descansando') , ('D','Desconectado') )
TIPOS_ACCION = ( ('A','Atacar') , ('H' ,'Usar habilidad') ,('D','Desplazarse'))
TIPOS_ARMADURA=(('C','Cuero'),('S','Seda'),('H','Hierro'))
class Arma(models.Model): #Tipos de arma
  nombre_es = models.CharField(maxlength=100,blank=False)
  nombre_en = models.CharField(maxlength=100,blank=False)
  tipo_dano = models.CharField(maxlength=1, choices=TIPOS_DANO)
  tipo_arma = models.CharField(maxlength=1, choices=TIPOS_ARMA)
  nivel_req = models.IntegerField() #nivel requerido para usarla
  dos_manos = models.BooleanField(default=False) # si requiere usar las dos manos
  dano      = models.FloatField(max_digits=5, decimal_places=2)
  icono     = models.CharField(maxlength=75,blank=True)
  icono_pro = models.CharField(maxlength=75,blank=True) #icono d los proyectiles
  verbose_name = _('Arma que utiliza unpersonajes')
  verbose_name_plural = _('Armas que utilizan los personajes')
  class Admin : pass
  def __str__(self):
    return self.nombre_es+" ( "+self.nombre_en+" )"
class Habilidad(models.Model):
  nombre_es = models.CharField(maxlength=100,blank=False)
  nombre_en = models.CharField(maxlength=100,blank=False)
  dano      = models.FloatField(max_digits=5, decimal_places=2)
  descripcion_es = models.TextField('Descripcion espanol',blank=True)
  descripcion_en = models.TextField('Descripcion ingles',blank=True)
  tipo_dano = models.CharField(maxlength=1, choices=TIPOS_DANO,blank=True)
  icono     = models.CharField(maxlength=75,blank=True)
  animacion = models.CharField(maxlength=75,blank=True)
  nivel_req = models.IntegerField() #nivel necesario para usar la habilidad
  verbose_name = _('Habilidad de un personaje')
  verbose_name_plural = _('Habilidades')
  class Admin: pass
  def __str__(self):
    return self.nombre_es+" ( "+self.nombre_en+" )"
class Hechizo(Habilidad):
  alcance   = models.FloatField(max_digits=5, decimal_places=2) #en unidades del mundo
  mana      = models.FloatField(max_digits=5, decimal_places=2) #mana q absorve
  class Admin:pass
  def __str__(self):
    return " Hechizo " + str(self.id)
class Golpe(Habilidad):
  arma_req     = models.ForeignKey(Arma, verbose_name='Tipo de arma para ejecutarlo')
  ataque_extra = models.BooleanField(default=False) #dos ataques en lugar de uno
  furia        = models.FloatField(max_digits=5, decimal_places=2,blank=True) #furia q absorve
  class Admin: pass
  def __str__(self):
    return " Golpe "+ str(self.id)
class Movimiento_Especial(Habilidad):
  nombre_es = nombre_es = models.CharField(maxlength=100,blank=False)
  nombre_en = models.CharField(maxlength=100,blank=False)
  energia   = models.FloatField(max_digits=5, decimal_places=2,blank=True) #energia que absorve
  verbose_name_plural = _('Movimientos especiales')
  class Admin:pass
  def __str__(self):
    return " Movimiento Especial "+ str(self.id)
class Clase(models.Model):
  tipo = models.CharField(maxlength=1, choices=TIPOS_PERSONAJES)
  tipo_armadura = models.CharField(maxlength=1, choices=TIPOS_ARMADURA)
  verbose_name = _('Clase de personaje')
  verbose_name_plural = _('Clases de personaje')
  class Mago(models.Model):
    mana        = models.FloatField(max_digits=5, decimal_places=2)
    tipo_armas  = models.CharField(maxlength=1, choices=(('P','Palo'),('B','Baston')))
    class Admin: pass
    def __str__(self):
      return "Mago"
  class Guerrero(models.Model):
    furia       = models.FloatField(max_digits=5, decimal_places=2)
    tipo_armas  = models.CharField(maxlength=1, choices=( ('P','Palo'),('E','Espada'),('H','Hacha')))
    class Admin: pass
    def __str__(self):
      return "Guerrero"
  class Arquero(models.Model):
    energia     = models.FloatField(max_digits=5, decimal_places=2)
    tipo_armas  = models.CharField(maxlength=1, choices=(('A','Arco'),('D','Daga')))
    class Admin: pass
    def __str__(self):
      return "Arquero"
  def __str__(self):
    return self.tipo
  class Admin: pass
class Personaje(models.Model):
  nick        = models.CharField(maxlength=16,blank=False)
  biografia   = models.TextField('Biografia del personaje')
  descripcion_es = models.TextField('Descripcion de la clase en espanol')
  descripcion_en = models.TextField('Descripcion de la clase en ingles')
  habilidades = models.ManyToManyField(Habilidad)
  num_muertes = models.IntegerField()
  inteligencia= models.FloatField(max_digits=5, decimal_places=2)
  habilidad   = models.FloatField(max_digits=5, decimal_places=2)
  fuerza      = models.FloatField(max_digits=5, decimal_places=2)
  destreza    = models.FloatField(max_digits=5, decimal_places=2)
  resistencia = models.FloatField(max_digits=5, decimal_places=2)
  armadura    = models.FloatField(max_digits=5, decimal_places=2)
  salud       = models.FloatField(max_digits=5, decimal_places=2)
  clase       = models.ForeignKey(Clase, verbose_name='Tipo de clase del personaje')
  nivel       = models.IntegerField()
  class Admin: pass
  def __str__(self):
    return " Personaje "+str(self.id)+" :"+self.nick+" [ "+ self.clase.tipo+ " ,nivel "+ str(self.nivel) +"]"
class Especie(models.Model):
  nombre_especie_es = models.CharField(maxlength=100,blank=False)
  nombre_especie_en = models.CharField(maxlength=100,blank=False)
  descripcion_es = models.TextField('Descripcion de la especie en espanol')
  descripcion_en = models.TextField('Descripcion de la especie en ingles')
  habilidades_especie = models.ManyToManyField(Habilidad) #habilidad como especie
  class Admin: pass
  def __str__(self):
    return self.nombre_especie_es+" ("+self.nombre_especie_en+" )"
class Raza(models.Model): #herede de una especie sus habilidades
  especie        = models.ForeignKey(Especie, verbose_name='Especie a la que pertenece la raza')
  nombre_raza_es = models.CharField(maxlength=100,blank=False)
  nombre_raza_en = models.CharField(maxlength=100,blank=False)
  descripcion_es = models.TextField('Descripcion de la raza en espanol')
  descripcion_en = models.TextField('Descripcion de la raza en ingles')
  habilidades_raza = models.ManyToManyField(Habilidad) #habilidades como raza
  clases    = models.ManyToManyField(Clase) #es de una determinada clase
  personajes= models.ManyToManyField(Personaje,blank=True) #es de una determinada clase
  class Admin: pass
  def __str__(self):
    return self.nombre_raza_es+" ("+self.nombre_raza_en+" )"
class Mundo(models.Model):
  nombre_mundo_es = models.CharField(maxlength=100,blank=False)
  nombre_mundo_en = models.CharField(maxlength=100,blank=False)
  descripcion_mundo_es = models.TextField('Descripcion del mundo en espanol')
  descripcion_mundo_en = models.TextField('Descripcion del mundo en ingles')
  especies = models.ManyToManyField(Especie,blank=True)
  def __str__(self):
    return self.nombre_mundo_es+" ("+self.nombre_mundo_en+" )"
  class Admin: pass
class Colonia(models.Model):
  nombre_colonia_es = models.CharField(maxlength=100,blank=False)
  nombre_colonia_en = models.CharField(maxlength=100,blank=False)
  descripcion_es = models.TextField('Descripcion de la colonia en espanol')
  descripcion_en = models.TextField('Descripcion de la colonia en ingles')
  mundo     = models.ForeignKey(Mundo, verbose_name='Mundo al que pertenece la colonia')
  razas     = models.ManyToManyField(Raza) #razas(y especies) que tiene el mundo
  def __str__(self):
    return self.nombre_colonia_es+" ("+self.nombre_colonia_en+" )"
  class Admin: pass
class Celda(models.Model):
    x = models.IntegerField()
    y = models.IntegerField()
    z = models.IntegerField() 
    imagen = models.CharField(maxlength=75,blank=True)
    estado = models.CharField(maxlength=1, choices=TIPOS_ESTADO_CELDA)
    verbose_name = _('Celda de una zona de un mapa(editar desde una zona)')
    verbose_name_plural = _('Celdas de una zona concreta')
    class Admin: pass
    def __str__(self):
      return "( X:"+ str(self.x)+",Y:"+str(self.y)+",Z:"+str(self.z)+") | estado:"+self.estado
class Zona(models.Model):
  nombre_zona_es = models.CharField(maxlength=100,blank=False)
  nombre_zona_en = models.CharField(maxlength=100,blank=False)
  imagen_zona    = models.CharField(maxlength=75,blank=False)
  descripcion_es = models.TextField('Descripcion de la zona en espanol')
  descripcion_en = models.TextField('Descripcion de la zona en ingles')
  colonia = models.ForeignKey(Colonia, verbose_name='Colonia a la que pertenece la zona')
  celdas  = models.ManyToManyField(Celda,blank=True)
  class Admin: pass
  def __str__(self):
    return self.nombre_zona_es+" ("+self.nombre_zona_en+" )"  

class Mapa(models.Model):
  nombre_mapa_es = models.CharField(maxlength=100,blank=False)
  nombre_mapa_en = models.CharField(maxlength=100,blank=False)
  ancho  = models.IntegerField()
  alto   = models.IntegerField()
  celdas = models.ManyToManyField(Celda)
  zona   = models.ForeignKey(Zona, verbose_name='Zona a la que pertenece el Mapa')
  class Admin:pass
  def __str__(self):
    return self.nombre_mapa_es+" ( "+self.nombre_mapa_en+" )"
class Jugador(models.Model): #Uno de los muchos asociados :P
  celda_actual = models.ForeignKey(Celda,blank=True)
  zona_actual  = models.ForeignKey(Zona,blank=True)
  estado_actual = models.CharField(maxlength=1, choices=TIPOS_ESTADO_PERSONAJE)
  accion_actual = models.CharField(maxlength=1, choices=TIPOS_ACCION,blank=True)
  ultima_actividad = models.DateTimeField()
  persona_asoc = models.ForeignKey(User) #usuario asociado
  personaje_asoc = models.ForeignKey(Personaje) #personaje que utiliza
  verbose_name = _('Jugador (personaje humano)')
  verbose_name_plural = _('Jugadores (personajes humanos)')
  class Admin:pass
  def __str__(self):
    return "Jugador "+ str(self.id)