#script pentru impartirea automata pe categorii
import os
import sys
import math
import time
import datetime
from vars import SYS_PATH
os.environ["DJANGO_SETTINGS_MODULE"] = "news.settings"
sys.path.append(SYS_PATH)

from django.conf import settings
from news.engine.create_training import LoadTraining
from news.engine.create_clusters import LoadClusters, SaveClusters
from news.engine.functions import list_intersection
from news.utils import get_news_logger

class CategorizeKNN(object):
    """Clasa ce imparte in categorii folosind metoda KNN
    """
    
    def __init__(self, lista_clustere):
        self.lista_clustere = lista_clustere
        self.training_loader = LoadTraining()
        self.lista_training = self.training_loader.lista_training
        #print len(self.lista_training)
        self.categorized_clusters = self.categorize(self.lista_clustere, self.lista_training)

    def categorize(self, lista_clustere, lista_training):
        #procedura propriu zisa de categorizare
        for cluster in lista_clustere:
            dict_temp = {}
            cuvinte_cluster = [item[1] for item in cluster['lista_cuvinte']]
            for item_categ in lista_training:
                cuvinte_training = item_categ['lista_cuvinte']
                #comparam cuvintele cheie ale clustereului cu un item-categ
                #din lista de training, pentru a vedea daca clusterul poate fi
                #atasat categoriei corespunzatoare item-categ-ului
                intersection_len = len(list_intersection(cuvinte_training, cuvinte_cluster))
                if intersection_len >= settings.CATEG_SIMIL:
                    #print cuvinte_training, cuvinte_cluster
                    if dict_temp.has_key(item_categ['id_categorie']):
                        dict_temp[item_categ['id_categorie']] += 1
                    else:
                        dict_temp[item_categ['id_categorie']] = 1
            if dict_temp:
                #daca clusterul a fost alaturat cel putin unei categorii,
                #o alegem pe cea cu cel mai mare numar de categ-items care au facut match
                lista_temp = [[value, key] for key, value in dict_temp.iteritems()]
                lista_temp.sort()
                lista_temp.reverse()
                #print lista_temp, cuvinte_cluster, cuvinte_training
                if lista_temp[0][0] >= settings.CATEG_VECINI:
                    cluster['categorie'] = lista_temp[0][1]
                    #print 'Am salvat cluster.'
        return lista_clustere

if __name__ == '__main__':
    inceput = time.time()
    clusters_loader = LoadClusters()
    lista_clustere = clusters_loader.lista_clustere
    categorizer = CategorizeKNN(lista_clustere)
    categorized_clusters = categorizer.categorized_clusters
    print len(categorized_clusters)
    #SaveClusters(categorized_clusters)
    #lista_temp = [item for item in lista_clustere if item['categorie'] != 0]
    #print len(lista_temp)
    """for cluster in lista_clustere:
        if cluster['categorie'] != 0:
            print cluster['categorie'], cluster"""
    print 'Programul a fost executat in %s secunde' %(str(time.time() - inceput))
