#!/usr/bin/env python
# encoding: iso-8859-15
#
#Minë. Mundo Interactivo-Narrativo en Español [Tierra-Media]
#Copyright (C) 2002  Pablo Ruiz Múzquiz
#
#
#This program is free software; you can redistribute it and/or modify
#it under the terms of the GNU General Public License as published by
#the Free Software Foundation; either version 2 of the License, or
#(at your option) any later version.
#
#This program is distributed in the hope that it will be useful,
#but WITHOUT ANY WARRANTY; without even the implied warranty of
#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#GNU General Public License for more details.
#
#You should have received a copy of the GNU General Public License
#along with this program; if not, write to the Free Software
#Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
#
#Fichero: tema.py

"""Clase Tema."""


from xml.dom import minidom
import random
import sys
import string
import os

from utils import *
from bloquedialogo import *
from item import *

class Tema(BloqueDialogo):
    """Objeto sobre el que puede indagar el jugador en la conversacion con un PNJ.
    
    Contiene los siguientes atributos:
     - _contexto
     - _nombre(string)
     - _sinonimos([string]): nombres alternativos del mismo tema
     - _items: items de texto que componen el tema

    Invariantes:
      _contexto != None
      _nombre != None
      _sinonimos != None
      _items != None & len(_items) > 0
    """
    
    
    def __init__(self, tema_xml, contexto):
	"""Crea un tema nuevo a partir de un arbol XML de descripción de tema.
	
	Requiere:
	  tema_xml != None
	  tema_xml corresponde con un nodo DOM de tema
	  contexto != None
	"""
	self._contexto = contexto
	self._nombre = tema_xml.getAttribute("nombre").encode('ISO-8859-1')
	self._items = self._parsear_items(tema_xml)
        if not self._items:
            raise ValueError("Tema " + self._nombre + " sin items." )
	self._sinonimos = self._parsear_sinonimos(tema_xml)
#	print "Tema: " + self._nombre
        
    def nombre(self):
        return self._nombre

    def agotado_en(self, visita):
        """Devuelve cierto si todos los items están visitados o inactivos en esta visita"""
	
	# Busca el primer item que cumpla los requisitos y no haya sido ya devuelto en esta conversación.
        for item in self.items():
            if item.satisfecho_en(visita) and (visita._item_repeticiones(item)!= 0 or not item in visita.items()):
                return 0
        return 1	
    
    def items(self):
        return self._items
    
    def contexto(self):
        return self._contexto
    
    def es_sinonimo(self, nombre):
        """Devuelve cierto si el nombre del tema está en la lista de sinónimos."""
        return nombre in self._sinonimos

    def __str__(self):
        texto = '\t<Tema - "' + self.nombre()
        texto = texto + '"\n\t\tSinonimos:\n'
        for sinonimo in self._sinonimos:
            texto = texto + "\t\t\t" + str(sinonimo) + "\n"
        texto = texto + "\t\tItems: \n"
        for item in self.items():
            texto = texto + str(item)
        texto = texto + "\t/>\n"
        return texto

class TemaEspecial(Tema):
    """Tema de tipo agotado, offtopic o no encontrado.
    
    Invariantes:
        _nombre = el nombre del anterior tema del que se haya hablado
    """
    def __init__(self, tema_xml, tipo):
	self._tipo = tipo
	self._items = self._parsear_items(tema_xml)
	self._nombre = "el tiempo" # Tema por defecto
#	print "Tema especial de tipo: " + self._tipo
        
    def nombre(self):
        return self._nombre

    def tipo(self):
        return self._tipo
    
    def agotado(self, visita):
        """Devuelve cierto si todos los items están visitados o inactivos en esta visita"""
	
	# Busca el primer item que cumpla los requisitos y no haya sido ya devuelto en esta conversación.
        for item in self.items():
	    print "satisfecho: " + str(item.satisfecho_en(visita))
	    print "repetido: " + str(item.repeticiones())
            if item.satisfecho_en(visita) and (visita._item_repeticiones(item, visita._items_especiales)!= 0 or not item in visita._items_especiales):
                return 0
        return 1	
    
    def __str__(self):
        texto = '\t<Tema especial - "' + self.tipo()
        texto = texto + "\t\tItems: \n"
        for item in self.items():
            texto = texto + str(item)
        texto = texto + "\t/>\n"
        return texto

# Código para pruebas unitarias del módulo.

if (__name__ == '__main__'):
    archivo = os.path.join(BloqueDialogo.DIR_DESC_DIALOGOS, "ejemplo",  "ejemplo-hablar" + BloqueDialogo.EXT_DESC_DIALOGOS)
    print archivo
    stream = open(archivo)
    doc_xml = minidom.parse(stream).documentElement
    aux = doc_xml.getElementsByTagName("tema")[0]
    
    tema = Tema(aux, None)
    stream.close()

    print "Tema cargado correctamente.\n" + str(tema) # + str(tema._sinonimos)
        
