import os
from datetime import datetime

from keras.callbacks import ModelCheckpoint, EarlyStopping

from glossolalia.loader import load_seeds, load_text
from glossolalia.lstm import LisSansTaMaman

"""
Les neurones viennent, et j'leur ai pas demandé

les sirènes bercent les nike de leurs spectateurs
la vie et le charme comme un Jean-Pierre rétro

les page rimes esthétique
la vie est le tapis, comme un Jean-Pierre philanthrope
un torrent ivre c'est un bout de Monet
La vie est un mystère
Nous est un peu de béton 
remplir de côté, c'est mon adage dans le feu
les mots dans la vitre, je me répare
vacante de blues
Nous sommes la vie et je suis né
Nous sommes les yeux qui ont la tronche de grammaire
Je suis un peu noir comme un mur de dix rimes

rimes en guise de subutex 
claque les armes sales
la tronche de ta rente
ésotérisme et pierre de novembre
"""
def train():
    # should_train = True
    nb_words = 20
    nb_epoch = 60
    nb_layers = 100
    dropout = .3  # TODO finetune layers/dropout
    validation_split = 0.2
    lstm = LisSansTaMaman(nb_layers, dropout, validation_split, debug=True)
    #
    filename_model = "../models/buko/buko_lstm%i-d%.1f-{epoch:02d}_%i-{accuracy:.4f}.hdf5" % (
        nb_layers, dropout, nb_epoch)
    dir = "./output/"
    filename_output = dir + "buko_%i-d%.1f_%s.txt" % (
        nb_layers, dropout, datetime.now().strftime("%y%m%d_%H%M"))
    callbacks_list = [
        ModelCheckpoint(filename_model, monitor='val_accuracy', period=10, save_best_only=True),
        EarlyStopping(monitor='val_accuracy', patience=5)]

    corpus = load_text("./genius.txt")
    print("Corpus:", corpus[:10])
    lstm.create_model(corpus)

    if not os.path.exists(dir):
        os.makedirs(dir)
    with open(filename_output, "a+") as f:
        for i in range(0, nb_epoch, 10):
            lstm.fit(epochs=min(i + 10, nb_epoch), initial_epoch=i,
                     callbacks=callbacks_list,
                     validation_split=validation_split)

            for output in lstm.predict_seeds(nb_words):
                print(output)
                f.writelines(output)

        for i, seed in enumerate(load_seeds(corpus, 5)):
            output = lstm.predict(seed, nb_words)
            print("%i %s -> %s" % (i, seed, output))
            f.writelines(output)

        while True:
            input_text = input("> ")
            text = lstm.predict(input_text, nb_words)
            print(text)
            f.writelines("%s\n" % text)


if __name__ == '__main__':
    train()
