import pandas
import numpy

from tcc.src.utils.registro import registro
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC

registro = registro()
log = registro.log()


class SVM:

    def classificar(self, data_frame_origin, target):

        log.debug('Executando SVM')

        data_frame = data_frame_origin
        log.info('Copiando data_frame_origin para o classificador')

        X = data_frame.drop(target, axis=1)
        y = data_frame[target]

        X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.30)

        classificador_svm = SVC(kernel='linear')
        log.info('Configurando o SVM kernel linear')

        print(classificador_svm.fit(X_train, y_train))
        log.info('Treinando SVM')

        reultado_SVM = []

        log.info("Realizando a predição do data_frame")
        for i in range(X_test.shape[0]):
            predicao = X_test.iloc[[i]]
            reultado_SVM.append(classificador_svm.predict(predicao))
            print("Id: " + str(i) + "\n Predição: " + str(predicao.values) + "\n Resultado: " + str(
                classificador_svm.predict(predicao)))

        log.info("Precisão: " + str(classificador_svm.score(X_test, y_test)))

        SVM = pandas.DataFrame(reultado_SVM)
        data_frame["resultado_SVM"] = SVM
        data_frame.rename(
            columns={0: 'gravidez',
                     1: 'glucose',
                     2: 'pressao_sanguinea',
                     3: 'espessura_da_pele',
                     4: 'insulina',
                     5: 'bmi',
                     6: 'funcao_de_pedigree_de_diabetes',
                     7: 'idade',
                     8: 'resultado'
                     }, inplace=True)

        data_frame.to_csv("../media/SVM.csv")
        log.warn("Gerando arquivo SVM.csv na pasta [../media/SVM.csv]")

        data_frame.to_excel("../media/SVM.xlsx")
        log.warn("Gerando arquivo SVM.xlsx na pasta [../media/SVM.xlsx]")

        log.info("Retornando data_frame classificado")
        return classificador_svm.score(X_test, y_test)
