MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{

    ui->setupUi(this);
    ui->dockWidget_Alphabet->hide();
    ui->dockWidget_Language->hide();


    //Ej
    alphabet.setName("Alfabeto1");
    alphabet.insert("a");
    alphabet.insert("b");
    showAlphabet();

    Language empty("Lenguaje Vacio",&alphabet);
    Language l1("Leng 1",&alphabet);
    l1.insert("aba");
    l1.insert("baa");
    Language l2("Leng 2",&alphabet);
    l2.insert("a");
    l2.insert("b");

    languageList.push_back(empty);
    languageList.push_back(l1);
    languageList.push_back(l2);


    listLanguages();
}
const char *LH_DataViewerConnector::userInit(){
    LH_QtInstance::userInit();
    hide();

    setup_feedback_ = new LH_Qt_QString(this, "Feedback", "", LH_FLAG_READONLY | LH_FLAG_NOSAVE | LH_FLAG_NOSINK | LH_FLAG_NOSOURCE);
    QStringList langs = listLanguages();
    qDebug() << "languages: " << langs.count() << ": " << langs.join(",");
    setup_language_ = new LH_Qt_QStringList(this,"Language",langs, LH_FLAG_AUTORENDER | LH_FLAG_NOSINK | LH_FLAG_NOSOURCE);
    setup_language_->setHelp("To add a new language copy the \"[List:<name>]\" blocks from the data map into a new file called lists.XX.txt (where XX is the language code, e.g. Spanish lists would go in a file called lists.ES.txt, French in lists.FR.txt) and translate the text values into the desired language.");
    setup_language_->setFlag(LH_FLAG_HIDDEN, langs.length()<=1);
    connect( setup_language_, SIGNAL(changed()), this, SLOT(languageFileChanged()) );

    setup_map_file_ = new LH_Qt_QFileInfo(this,"Data Map",QFileInfo(), LH_FLAG_AUTORENDER | LH_FLAG_NOSINK | LH_FLAG_NOSOURCE );
    setup_map_file_->setHelp("The data map file contains information needed to understand and parse the data source.<br><br>"
                             "(Unlike text files, XML data sources do not require a map file, although they do support them if advanced data parsing or data-expiriation is required.)");
    connect( setup_map_file_, SIGNAL(changed()), this, SLOT(mapFileChanged()) );

    setup_data_file_ = new LH_Qt_QFileInfo(this,"Data Source",QFileInfo(), LH_FLAG_AUTORENDER | LH_FLAG_NOSINK | LH_FLAG_NOSOURCE );
    setup_data_file_ ->setHelp("The data source. Only XML data sources can be understood without a data map. If the datamap specifies \"MEM\" as the type then no source file is required.");
    connect( setup_data_file_, SIGNAL(changed()), this, SLOT(sourceFileChanged()) );

    sourceWatcher_ = new QFileSystemWatcher(this);
    connect( sourceWatcher_, SIGNAL(fileChanged(const QString)), this, SLOT(sourceFileUpdated(const QString)) );

    rootNode = new dataNode();
    sharedData = new sharedCollection();

    connect( this, SIGNAL(initialized()), this, SLOT(sourceFileUpdated()) );

    return NULL;
}
void MainWindow::createLanguage(){
    Language language(ui->languageName->text(),&alphabet);
    QString words = ui->words->toPlainText();
    words.trimmed();

    QStringList wordsList=words.split(',');
    for(int i=0;i<wordsList.count();i++)
        language.insert(wordsList.at(i));
    this->languageList.push_back(language);

    listLanguages();
    ui->languageList->setCurrentIndex(ui->languageList->count()-1);

    ui->dockWidget_Language->hide();
}
void MainWindow::openLanguage(){
    if(!alphabet.empty()){
        QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"), "",
            tr("Text Files (*.txt)"));

        if (fileName != "") {
            QFile file(fileName);
            if (!file.open(QIODevice::ReadOnly)) {
                QMessageBox::critical(this, tr("Error"),
                tr("No se pudo abrir el archivo."));
                return;
            }
            if(!file.atEnd()){
                Language language(QString(file.readLine()).trimmed(),&alphabet);
                language.setPath(fileName.trimmed());
                QString words = file.readLine();

                QString _lambda(QChar(955));
                QString first=words.at(0);
                if(first==",")
                    words.prepend(_lambda);


                QStringList wordsList=words.split(',');
                    for(int i=0;i<wordsList.count();i++){
                         language.insert(wordsList.at(i));
                         //qDebug()<<"palabra";
                         //qDebug()<<wordsList.at(i);
                    }

                    this->languageList.push_back(language);
                    //qDebug()<<this->languageList.at(languageList.count()-1);
            }else
                QMessageBox::critical(this, tr("Error"),
                 tr("Archivo Vacio."));
            file.close();
            listLanguages();
            ui->languageList->setCurrentIndex(ui->languageList->count()-1);
        }

    }else
        QMessageBox::critical(this, tr("Error"),
        tr("Debe haber un alfabeto cargado."));

}
void MainWindow::createAlphabet(){
    QString simbols;
    QStringList simbolsList;

    this->alphabet.setName(ui->AlphabetName->text());

    simbols=ui->simbols->toPlainText();
    simbols.trimmed();
    simbolsList=simbols.split(',');

    for(int i=0;i<simbolsList.count();i++){
        if(!((simbolsList.at(i)>="a"&&simbolsList.at(i)<="z"))){
            simbolsList.removeAt(i);
        }
    }

    if(!simbolsList.isEmpty()){
        alphabet.clear();
        for(int i=0;i<simbolsList.count();i++){
            alphabet.insert(simbolsList.at(i));
        }
        showAlphabet();
        ui->dockWidget_Alphabet->hide();
        //Revalidar palabras para el nuevo alfabeto
        for(int i=0;i<languageList.count();i++){
            Language l=languageList.takeAt(i);
            l.revalidateWords();
            languageList.insert(i,l);
        }
        int index=ui->languageList->currentIndex();
        listLanguages();
        ui->languageList->setCurrentIndex(index);

    }else{
        QMessageBox::critical(this, tr("Error"),
        tr("El alfabeto debe tener al menos un simbolo."));
    }
}