import dataset
import scipy

class Project:
    def __init__(self,name="Testing"):
        self.name = name
        self.dim_names = []
        self._selection_observers = []
        self.current_selection = {}
        self.current_data=[]
        self.datasets=[]
        
    def attach(self, observer):
        """Attach observer for selection updates"""
        if not observer in self._selection_observers:
            self._selection_observers.append(observer)

    def detach(self, observer):
        """Detach observer for selection updates"""
        try:
            self.selection_observers.remove(observer)
        except ValueError:
            pass

    def notify(self, modifier=None):
        """Notifies observers that selection is updated"""
        for observer in self.selection_observers:
            if modifier != observer:
                observer.update(self)

    def set_selection(self,sel_obj,dim_name,selection):
        """Sets selection and notifies observers"""
        current_selection = set(selection)
        sel_obj.current_selection[dim_name] = current_selection
        self.current_selection[dim_name] = current_selection
        self.notify()

    def get_selection(self,sel_obj):
        """Returns the current selection object"""
        return sel_obj.current_selection
    
    def add_dataset(self,dataset):
        """Appends a new Dataset to the project."""
        self.datasets.append(dataset)
        for dim_name in dataset.ids.keys():
            if dim_name not in self.dim_names:
                self.dim_names.append(dim_name)

    def suggest_dim_name(self,dim_name):
        """Creates an arbitrary unique name for a new dimension."""
        if dim_name in self.dim_names:
            dim_name = dim_name + "_t" 
        return dim_name
        
# FIXME: Singleton project should be removed.
c_p = Project()

#add test data
x = scipy.rand(2000,3)
def_list = [ ['samples',[]], ['genes',['a','b','c']] ]
test_data = dataset.Dataset(x,def_list)
c_p.add_dataset(test_data)

y = scipy.rand(2,2)
def_list = [ ['samples',['1','2']], ['yclasses',['C','N']] ]
test_data = dataset.Dataset(y,def_list)
c_p.add_dataset(test_data)

#add selection object
c_p.sel_obj = dataset.Selection()