import random
import nltk
import json
import pickle
import numpy as np
from nltk.stem import WordNetLemmatizer
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense,Activation,Dropout
from tensorflow.keras.optimizers.legacy import SGD
try:
    lemmatiser = WordNetLemmatizer()

    intents = json.loads(open("intents.json").read())

    words = []
    classes = []
    documents = []
    ignore_letters = ["?","!",".",","]

    for intent in intents['intents']:
        for pattern in intent["patterns"]:
            word_list = nltk.word_tokenize(pattern)
            words.extend(word_list)
            documents.append((word_list,intent['tag']))
            if intent['tag'] not in classes:
                classes.append(intent['tag'])

    words = [lemmatiser.lemmatize(word) for word in words if word not in ignore_letters]
    words = sorted(set(words))
    # print(words)
    classes = sorted(set(classes))

    pickle.dump(words,open('words.pkl','wb'))
    pickle.dump(classes,open('classes.pkl','wb'))

    training = []
    output_empty = [0]*len(classes)

    for document in documents:
        bag = []
        word_patterns = document[0]
        word_patterns = [lemmatiser.lemmatize(word.lower()) for word in word_patterns]
        for word in words:
            bag.append(1) if word in word_patterns else bag.append(0)
        output_row = list(output_empty)
        output_row[classes.index(document[1])] = 1
        training.append([bag,output_row])

    random.shuffle(training)
    print(training)
    training = np.array(training,dtype="object")

    train_x = list(training[:,0])
    train_y = list(training[:,1])

    model = Sequential()
    model.add(Dense(128,input_shape=(len(train_x[0]),),activation='relu'))
    model.add(Dropout(0.5))
    model.add(Dense(64,activation= 'relu'))
    model.add(Dropout(0.5))
    model.add(Dense(len(train_y[0]),activation='softmax'))

    sgd = SGD(lr=0.01,decay=1e-6,momentum=0.9,nesterov=True)
    model.compile(loss='categorical_crossentropy',optimizer=sgd,metrics=['accuracy'])
    hist = model.fit(np.array(train_x),np.array(train_y),epochs=200,batch_size=5,verbose=1)
    model.save("model.h5",hist)
    print("done")
except Exception as e:
    pass

y= """
import csv
import json 
import time
reader = csv.reader(open("./t.csv"))
data = {"intents":[]}
for x in reader:
    y = {"tag":"","patterns":[],"response":[]}

    for z in range(len(x)):
        if z ==0:
            y["tag"] = x[z]
        else:
            y["patterns"].append(x[z])
    
    # print(y)
    data["intents"].append(y)

print(data)
json.dump(data,open("test.json","w"))
        


"""
print(y)