#!/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: contexto.py

"""Clase Contexto."""


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

from utils import *
from tema import *
from bloquedialogo import *

class Contexto(BloqueDialogo):
    """Una coleccion de temas relacionados.
    
    Contiene los siguientes atributos:
     - id (string): identifica univocamente al contexto. No puede contener espacios.
     - _conversacion (string): nombre de la conversacion a la que pertenece el contexto.
     - _temas: lista de temas contenidos en el contexto.
     - _temas_especiales: diccionario con las lista de temas especiales ("temaAgotado", "temaNoEncontrado" y "temaOfftopic")
    

    Invariantes:
      id != None
      _conversacion != None
    """

    def __init__(self, contexto_xml, conversacion):
	"""Crea un contexto nuevo a partir de un arbol XML de descripción de contexto.
	
	Requiere:
	  contexto_xml != None
	  contexto_xml corresponde con un nodo DOM de contexto
	  conversacion != None
	"""
	
	self.id = contexto_xml.getAttribute("id").encode('ISO-8859-1')
#	print "Contexto: " + self.id
	self._conversacion = conversacion
	self._temas = self._parsear_temas(contexto_xml)
        self._temas_especiales = self._parsear_temas_especiales(contexto_xml)
	nombres = contexto_xml.getElementsByTagName("nombre")
	if nombres:
	    self._nombre = nombres[0].firstChild.data.encode('ISO-8859-1')
	else:
            self._nombre = self.id.split('-')[1]
        
    def conversacion(self):
        return self._conversacion
    
    def nombre(self):
        return self._nombre
    
    def tema(self, nombretema):
        """Devuelve el tema con ese nombre, si está en este contexto."""
        try:
            i = map(lambda t: t.nombre(), self._temas).index(nombretema)
            return self._temas[i]
        except:
            return None
        
    def temas(self):
        return self._temas

    def temas_especiales(self):
        return self._temas_especiales

    def __str__(self):
        texto = '  <Contexto - "' + self.id
        texto = texto + '"\n\tTemas:\n'
        for tema in self._temas:
            texto = texto + "\t\t" + tema.nombre() + "\n"
        texto = texto + "  />\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
    
    contexto = Contexto(doc_xml, None)
    stream.close()

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