#include "tabulka.h"
#include "ui_tabulka.h"

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

    ui->setupUi(this);


    connect(this->ui->tabulka,SIGNAL(itemSelectionChanged()),this,SLOT(copy_to_clipboard()));
    connect(this->ui->pushButton,SIGNAL(clicked()),this,SLOT(button_clicked()));

    connect(this->ui->spinBox,SIGNAL(valueChanged(int)),this,SLOT(vypis(int)));
    connect(this->ui->spinBox_2,SIGNAL(valueChanged(int)),this,SLOT(vypis(int)));
    connect(this->ui->radioButton,SIGNAL(toggled(bool)),this,SLOT(vypis()));
    connect(this->ui->radioButton_2,SIGNAL(toggled(bool)),this,SLOT(vypis()));
    connect(this->ui->radioButton_3,SIGNAL(toggled(bool)),this,SLOT(vypis()));
    connect(this->ui->radioButton_4,SIGNAL(toggled(bool)),this,SLOT(vypis()));



     cb= QApplication::clipboard();

    ui->tabulka->setRowCount(0);


}

Tabulka::~Tabulka()
{
    delete ui;
}

void Tabulka::changeEvent(QEvent *e)
{
    QMainWindow::changeEvent(e);
    switch (e->type()) {
    case QEvent::LanguageChange:
        ui->retranslateUi(this);
        break;
    default:
        break;
    }
}

QString Tabulka::chyba(BOD ref, BOD a){
    QString ret;
    int delta_x=a.x+ref.x;
    int delta_y=a.y+ref.y;
    int vysledek=abs(delta_x)+abs(delta_y);
    ret=QString::number(vysledek);
    return ret;
}

QString Tabulka::prepocet(BOD ref, BOD a){
    QString ret;
    int delta_x=a.x+ref.x;
    int delta_y=a.y+ref.y;
    ret=QString::number(delta_x)+";"+QString::number(delta_y);
    return ret;
}

void Tabulka::add_row(QStringList text){

    QTableWidget * filesTable =ui->tabulka;//= new QTableWidget(0, 2);
    int row = filesTable->rowCount();
    filesTable->insertRow(row);

    for(int i=0;i<text.count();i++){
        QTableWidgetItem *fileNameItem = new QTableWidgetItem;
        fileNameItem->setText(text.at(i));
        filesTable->setItem(row, i,fileNameItem);
    }


}

void Tabulka::vypis_zaklad(){

    ui->tabulka->setRowCount(0);
    ui->tabulka->setColumnCount(15);

    QStringList radek;
    radek.append("ref");
    radek.append("K t");
    radek.append("K p");
    radek.append("H t");
    radek.append("H p");
    radek.append("MH t");
    radek.append("MH p");
    radek.append("Cis t");
    radek.append("Cis p");
    radek.append("Ris t");
    radek.append("Ris p");
    radek.append("CR t");
    radek.append("CR p");
    this->add_row(radek);
    for(int i=0;i<this->ref_hodnoty.length();i++){
        radek.clear();
        radek.append(QString::number(ref_hodnoty.at(i).x)+";"+QString::number(ref_hodnoty.at(i).y)+";"+QString::number(ref_hodnoty.at(i).r));//ref
        radek.append(QString::number(korel_hodnoty.at(i).r));//korel t
        radek.append(prepocet(ref_hodnoty.at(i),korel_hodnoty.at(i)));//korel p
        radek.append(QString::number(hd_hodnoty.at(i).r));//H t
        radek.append(prepocet(ref_hodnoty.at(i),hd_hodnoty.at(i)));        //H p
        radek.append(QString::number(hhd_hodnoty.at(i).r));//MH t
        radek.append(prepocet(ref_hodnoty.at(i),hhd_hodnoty.at(i)));//MH p
        radek.append(QString::number(cis_hodnoty.at(i).r));//Cis t
        radek.append(prepocet(ref_hodnoty.at(i),cis_hodnoty.at(i)));//Cis p
        radek.append(QString::number(ras_hodnoty.at(i).r));//Ras t
        radek.append(prepocet(ref_hodnoty.at(i),ras_hodnoty.at(i)));//Ras p
        radek.append(QString::number(cisras_hodnoty.at(i).r));//CR t
        radek.append(prepocet(ref_hodnoty.at(i),cisras_hodnoty.at(i)));//CR p

        this->add_row(radek);
    }

}

void Tabulka::vypis_chyby(){
    ui->tabulka->setRowCount(0);
    ui->tabulka->setColumnCount(15);

//    ui->tabulka->clear();
    QStringList radek;
    radek.append("ref");    
    radek.append("K p");    
    radek.append("H p");    
    radek.append("MH p");
    radek.append("Cis p");
    radek.append("Ris p");
    radek.append("CR p");
    this->add_row(radek);
    for(int i=0;i<this->ref_hodnoty.length();i++){
        radek.clear();
        radek.append(QString::number(ref_hodnoty.at(i).x)+";"+QString::number(ref_hodnoty.at(i).y)+";"+QString::number(ref_hodnoty.at(i).r));//ref        
        radek.append(chyba(ref_hodnoty.at(i),korel_hodnoty.at(i)));//korel p        
        radek.append(chyba(ref_hodnoty.at(i),hd_hodnoty.at(i)));        //H p        
        radek.append(chyba(ref_hodnoty.at(i),hhd_hodnoty.at(i)));//MH p        
        radek.append(chyba(ref_hodnoty.at(i),cis_hodnoty.at(i)));//Cis p        
        radek.append(chyba(ref_hodnoty.at(i),ras_hodnoty.at(i)));//Ras p
        radek.append(chyba(ref_hodnoty.at(i),cisras_hodnoty.at(i)));//CR p

        this->add_row(radek);
    }

}

void Tabulka::vypis_chyby_bez_natoceni(){
    ui->tabulka->setRowCount(0);
    ui->tabulka->setColumnCount(15);

//    ui->tabulka->clear();
    QStringList radek;
    radek.append("ref");
    radek.append("K p");
    radek.append("H p");
    radek.append("MH p");
    radek.append("Cis p");
    radek.append("Ris p");
    radek.append("CR p");
    this->add_row(radek);
    int minimalni_uhel=ui->spinBox->text().toInt();
    for(int i=0;i<this->ref_hodnoty.length();i++){
        radek.clear();
        radek.append(QString::number(ref_hodnoty.at(i).x)+";"+QString::number(ref_hodnoty.at(i).y)+";"+QString::number(ref_hodnoty.at(i).r));//ref
        radek.append(chyba(ref_hodnoty.at(i),korel_hodnoty.at(i)));//korel p
        radek.append(chyba(ref_hodnoty.at(i),hd_hodnoty.at(i)));        //H p
        radek.append(chyba(ref_hodnoty.at(i),hhd_hodnoty.at(i)));//MH p
        radek.append(chyba(ref_hodnoty.at(i),cis_hodnoty.at(i)));//Cis p
        radek.append(chyba(ref_hodnoty.at(i),ras_hodnoty.at(i)));//Ras p
        radek.append(chyba(ref_hodnoty.at(i),cisras_hodnoty.at(i)));//CR p


        if(abs(ref_hodnoty.at(i).r)>minimalni_uhel)
            continue;
        this->add_row(radek);
    }
}


void Tabulka::vypis_chyby_jen_natoceni(){
    ui->tabulka->setRowCount(0);
    ui->tabulka->setColumnCount(15);

//    ui->tabulka->clear();
    QStringList radek;
    radek.append("ref");
    radek.append("K p");
    radek.append("H p");
    radek.append("MH p");
    radek.append("Cis p");
    radek.append("Ris p");
    radek.append("CR p");
    this->add_row(radek);
    int maximalni_uhel=ui->spinBox_2->text().toInt();
    for(int i=0;i<this->ref_hodnoty.length();i++){
        radek.clear();
        radek.append(QString::number(ref_hodnoty.at(i).x)+";"+QString::number(ref_hodnoty.at(i).y)+";"+QString::number(ref_hodnoty.at(i).r));//ref
        radek.append(chyba(ref_hodnoty.at(i),korel_hodnoty.at(i)));//korel p
        radek.append(chyba(ref_hodnoty.at(i),hd_hodnoty.at(i)));        //H p
        radek.append(chyba(ref_hodnoty.at(i),hhd_hodnoty.at(i)));//MH p
        radek.append(chyba(ref_hodnoty.at(i),cis_hodnoty.at(i)));//Cis p
        radek.append(chyba(ref_hodnoty.at(i),ras_hodnoty.at(i)));//Ras p
        radek.append(chyba(ref_hodnoty.at(i),cisras_hodnoty.at(i)));//CR p


        if(abs(ref_hodnoty.at(i).r)<maximalni_uhel)
            continue;
        this->add_row(radek);
    }
}


void Tabulka::vypis_cas_normalizuj(){
    ui->tabulka->setRowCount(0);
    ui->tabulka->setColumnCount(15);

    //hledanimaxima:
    int max_k=0,max_h=0,max_mh=0,max_cis=0,max_ris=0,max_rc=0;
    for(int i=0;i<this->ref_hodnoty.length();i++){
        if(max_k<korel_hodnoty.at(i).r)
            max_k=korel_hodnoty.at(i).r;

        if(max_h<hd_hodnoty.at(i).r)
            max_h=hd_hodnoty.at(i).r;

        if(max_mh<hhd_hodnoty.at(i).r)
            max_mh=hhd_hodnoty.at(i).r;

        if(max_cis<cis_hodnoty.at(i).r)
            max_cis=cis_hodnoty.at(i).r;

        if(max_ris<ras_hodnoty.at(i).r)
            max_ris=ras_hodnoty.at(i).r;

        if(max_rc<cisras_hodnoty.at(i).r)
            max_rc=cisras_hodnoty.at(i).r;

    }

    QStringList radek;
    radek.append("K t");
    radek.append("K tn");
    radek.append("H t");
    radek.append("H tn");
    radek.append("Mh t");
    radek.append("Mh tn");
    radek.append("Cis t");
    radek.append("Cis tn");
    radek.append("Ris t");
    radek.append("Ris tn");
    radek.append("RC t");
    radek.append("RC tn");
    this->add_row(radek);

    for(int i=0;i<this->ref_hodnoty.length();i++){
        radek.clear();
        radek.append(QString::number(korel_hodnoty.at(i).r));//korel t
        radek.append(QString::number(korel_hodnoty.at(i).r/max_k));//korel tn
        radek.append(QString::number(hd_hodnoty.at(i).r));//H t
        radek.append(QString::number(hd_hodnoty.at(i).r/max_h));//H tn
        radek.append(QString::number(hhd_hodnoty.at(i).r));//MH t
        radek.append(QString::number(hhd_hodnoty.at(i).r/max_mh));//MH t
        radek.append(QString::number(cis_hodnoty.at(i).r));//Cis t
        radek.append(QString::number(cis_hodnoty.at(i).r/max_cis));//Cis t
        radek.append(QString::number(ras_hodnoty.at(i).r));//Ras t
        radek.append(QString::number(ras_hodnoty.at(i).r/max_ris));//Ras t
        radek.append(QString::number(cisras_hodnoty.at(i).r));//CR t
        radek.append(QString::number(cisras_hodnoty.at(i).r/max_rc));//CR t

        this->add_row(radek);
    }

}


void Tabulka::Parse_File(QString file_name){
    QFile file (file_name);
    if (! (file.open(QFile::ReadOnly  ))){
        QMessageBox::critical(this, tr("QMessageBox::critical()"),"nelze otevrit soubor, koncim");
        return;
    }
    QTextStream stream( &file );
    QString line;

    ref_hodnoty.clear();
    cis_hodnoty.clear();;
    ras_hodnoty.clear();
    cisras_hodnoty.clear();;
    korel_hodnoty.clear();
    hd_hodnoty.clear();
    hhd_hodnoty.clear();

    int i=0;

    bool run_pass=false;
    while( !stream.atEnd() ) {
         line = stream.readLine();
         std::cout<<line.toStdString()<<"\n";
         QString pom_line=line;

         if(pom_line.replace(QRegExp(".*png$"),"")=="" &&run_pass==true){
            ref_hodnoty.append(this->Parse_Headr(line));
        }

        if(line=="RUN")
            run_pass=true;

        pom_line=line;
        if(pom_line.contains(QRegExp("^CIS.*$" )) && run_pass==true ){
            cis_hodnoty.append(this->Parse_Metody(line));
        }

        if(pom_line.contains(QRegExp("^RIS.*$" )) && run_pass==true ){
            ras_hodnoty.append(this->Parse_Metody(line));
        }

        if(pom_line.contains(QRegExp("^DRICCIS.*$" )) && run_pass==true ){
            cisras_hodnoty.append(this->Parse_Metody(line));
        }

        if(pom_line.contains(QRegExp("^HD.*$" )) && run_pass==true ){
            hd_hodnoty.append(this->Parse_Metody(line));
        }

        if(pom_line.contains(QRegExp("^MHD.*$" )) && run_pass==true ){
            hhd_hodnoty.append(this->Parse_Metody(line));
        }

        if(pom_line.contains(QRegExp("^Korel.*$" )) && run_pass==true ){
            korel_hodnoty.append(this->Parse_Metody(line));
        }
         i++;
    }
    file.close(); // when your done.

    vypis();
}


void Tabulka::vypis(){
    if(ui->radioButton->isChecked())
        this->vypis_zaklad();

    if(ui->radioButton_2->isChecked())
        this->vypis_chyby();

    if(ui->radioButton_3->isChecked())
        this->vypis_cas_normalizuj();


    if(ui->radioButton_4->isChecked())
        this->vypis_chyby_bez_natoceni();


    if(ui->radioButton_5->isChecked())
        this->vypis_chyby_jen_natoceni();

}

void Tabulka::vypis(int x){
    this->vypis();
}


BOD Tabulka::Parse_Metody(QString line){
    QStringList cisla=line.split("\t");
    if(cisla.length()!=4){
        QMessageBox::critical(this, tr("QMessageBox::critical()"),"Chyba parseru, koncim");
        return BOD(0,0,0);
    }

    QString a=cisla.at(1);
    QString b=cisla.at(2);
    QString c=cisla.at(3);
    return BOD(b.toFloat(),c.toFloat(),a.toFloat() );
}


BOD Tabulka::Parse_Headr(QString line){
//    QStringList split=foldr.split("/");
//    line=line.replace(QRegExp("\\..*$"),"");
    QStringList cisla;
    int stav_hledani=0;
    for(int i=0;i<line.length();i++){
        if(line.at(i)=='-' || (line.at(i)>='0' && line.at(i)<='9') ){
            if(stav_hledani==0){
                cisla.append("");
            }
            cisla.last()+=line.at(i);
            //cislo=cislo+line.at(i);
            stav_hledani=1;
        }else{
            stav_hledani=0;
        }
    }

    if(cisla.length()!=3){
        QMessageBox::critical(this, tr("QMessageBox::critical()"),"Chyba parseru, koncim");
        return BOD(0,0,0);
    }

    QString a=cisla.at(0);
    QString b=cisla.at(1);
    QString c=cisla.at(2);
    return BOD(a.toFloat(),b.toFloat(),c.toFloat() );

}



/////////SLOTY


void Tabulka::copy_to_clipboard(){
    QString alfa="";
    QList<QTableWidgetItem*> list = ui->tabulka->selectedItems();


    int column_index=-1;
    int row_index=-1;

    int old_column_index;


    QStringList radek;
    int ofset=0;
    if(list.count()<=0)
        return;
    ofset=list.at(0)->row();
    //old_column_index=list.at(0)->column();
    for(int i=0;i<list.count();i++){
        column_index=list.at(i)->column();
        row_index=list.at(i)->row();

        if(radek.count()<=row_index-ofset)
            radek.append("");

        QString a=radek.at(row_index-ofset);

        a+=list.at(i)->text();
        a+="*";

        radek.removeAt(row_index-ofset);
        radek.insert(row_index-ofset,a);


        old_column_index=column_index;
    }



    for(int i=0;i<radek.count();i++){
      alfa+=radek.at(i)+"\n";
    }



   // alfa=alfa.replace(QRegExp(";"),"");

    //ui->label->setText(alfa);


   // cb->setMimeData(&mime, QClipboard::Clipboard);
    cb->clear();

    //cb->setText("aho \ncus");
    cb->setText(alfa);
}

void Tabulka::button_clicked(){
    QString fileName = QFileDialog::getOpenFileName(this, tr("Nacti soubor"),
                                                               "",
                                                               tr("Vystup automatu (*.txt )"));
    Parse_File(fileName);

}
