#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "dialog1.h"
#include <QPixmap>
#include <QMessageBox>
#include <QRadioButton>
#include <QDebug> // Für Debugging-Ausgaben
#include "paymentprocessor.h"
#include "zubereitung.h"
#include "display.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow),
    secondwindow(new Dialog1(this)),
    //paymentProcessor(new PaymentProcessor()), // Initialisierung von paymentProcessor
    selectedRamen(Tonkotsu),
    selectedSauce(Soy)
{
    ui->setupUi(this);

    //secondwindow->show();

    Zubereitung *zubereitung = new Zubereitung(selectedRamen, selectedSauce);

    // Überprüfen Sie, ob das Zubereitung-Objekt erfolgreich erstellt wurde
    if (zubereitung != nullptr) {
        // Initialisieren Sie den PaymentProcessor mit dem Zubereitung-Objekt
        paymentProcessor = new PaymentProcessor(zubereitung);

        // Weitere Initialisierungen und Signal-Slot-Verbindungen
        // ...

        // Debugging-Ausgabe zur Überprüfung der Initialisierung
        qDebug() << "PaymentProcessor initialized: " << (paymentProcessor != nullptr);

        // ...

        updateLabels();
    } else {
        qDebug() << "Error: Failed to create Zubereitung object!";
        // Möglicherweise müssen Sie hier eine Fehlerbehandlung hinzufügen
    }


    qDebug() << "PaymentProcessor initialized: " << (paymentProcessor != nullptr);



    // Debugging-Ausgabe zur Überprüfung der Initialisierung
    qDebug() << "PaymentProcessor initialized: " << (paymentProcessor != nullptr);
    paymentProcessor->setTotalAmount(0.0);

    ui->cardButtonsWidget->setVisible(false);
    ui->cashButtonsWidget->setVisible(false);
    ui->labelTotalAmount->setText(QString::number(paymentProcessor->getTotalAmount()) + " €");
    ui->labelPaidAmount->setText(QString::number(paymentProcessor->getPaidAmount()) + " €");

    // Signal-Slot-Verbindungen
    connect(paymentProcessor, &PaymentProcessor::paymentUpdated, this, &MainWindow::updatePaidAmount);
    connect(paymentProcessor, &PaymentProcessor::paymentSuccessful, this, &MainWindow::showPaymentSuccessMessage);

    connect(ui->buttonCard1, &QPushButton::clicked, this, &MainWindow::on_cardButton_clicked);
    connect(ui->buttonCard2, &QPushButton::clicked, this, &MainWindow::on_cardButton_clicked);
    connect(ui->buttonCard3, &QPushButton::clicked, this, &MainWindow::on_cardButton_clicked);
    connect(ui->buttonCash10, &QPushButton::clicked, this, &MainWindow::on_cashButton_clicked);
    connect(ui->buttonCash5, &QPushButton::clicked, this, &MainWindow::on_cashButton_clicked);
    connect(ui->buttonCash2, &QPushButton::clicked, this, &MainWindow::on_cashButton_clicked);
    connect(ui->buttonCash1, &QPushButton::clicked, this, &MainWindow::on_cashButton_clicked);
    connect(ui->bestaetigen_2, &QPushButton::clicked, this, &MainWindow::on_bestaetigen_2_clicked);
    //connect(ui->buttonConfirmSelection, &QPushButton::clicked, this, &MainWindow::on_buttonConfirmSelection_clicked);
    connect(ui->buttonCheckCashBalance, &QPushButton::clicked, this, &MainWindow::checkCashBalance);
    connect(ui->buttonClearCashBalance, &QPushButton::clicked, this, &MainWindow::clearCashBalance);


    updateLabels(); connect(ui->buttonCheckCashBalance, &QPushButton::clicked, this, &MainWindow::checkCashBalance);
    connect(ui->buttonClearCashBalance, &QPushButton::clicked, this, &MainWindow::clearCashBalance);
    connect(ui->startSimulationButton, &QPushButton::clicked, this, &MainWindow::on_startSimulationButton_clicked);
    connect(paymentProcessor, &PaymentProcessor::paymentSuccessful, this, &MainWindow::updateChangeLabel);

/*
    QPixmap ramen(":/re.png");
    int w = ui->ramen_pic->width();
    int h = ui->ramen_pic->height();
    ui->ramen_pic->setPixmap(ramen.scaled(w,h,Qt::KeepAspectRatio));

    QPixmap tonkotsu(":/new/ramen_menu/ICON/tonkotsu.png");
    int w1 = ui->label_2->width();
    int h1 = ui->label_2->height();
    ui->label_2->setPixmap(tonkotsu.scaled(w1,h1,Qt::KeepAspectRatio));

    QPixmap kimchi(":/new/ramen_menu/ICON/kimchi.png");
    int w2 = ui->kimchi_pic->width();
    int h2 = ui->kimchi_pic->height();
    ui->kimchi_pic->setPixmap(kimchi.scaled(w2,h2,Qt::KeepAspectRatio));

    QPixmap garlic(":/new/ramen_menu/ICON/marutai-kumamoto-ma-yu-black-garlic-oil-tonkotsu-instant-ramen-3-packs-japanese-taste-3.jpg");
    int w3 = ui->garlic_pic->width();
    int h3 = ui->garlic_pic->height();
    ui->garlic_pic->setPixmap(garlic.scaled(w3,h3,Qt::KeepAspectRatio));

    QPixmap spicy_miso(":/new/ramen_menu/ICON/Spicy_Kimshi_Miso.png");
    int w4 = ui->Spicy_Kimchi_Miso_pic->width();
    int h4 = ui->Spicy_Kimchi_Miso_pic->height();
    ui->Spicy_Kimchi_Miso_pic->setPixmap(spicy_miso.scaled(w4,h4,Qt::KeepAspectRatio));

    QPixmap spicy_beef(":/new/ramen_menu/ICON/spicy_kimchi.png");
    int w5 = ui->Spicy_Kimshi_Beef_pic->width();
    int h5 = ui->Spicy_Kimshi_Beef_pic->height();
    ui->Spicy_Kimshi_Beef_pic->setPixmap(spicy_beef.scaled(w5,h5,Qt::KeepAspectRatio));

    QPixmap Shoyu_Chicken(":/new/ramen_menu/ICON/Shoyu.png");
    int w6 = ui->Shoyu_Chicken_pic->width();
    int h6 = ui->Shoyu_Chicken_pic->height();
    ui->Shoyu_Chicken_pic->setPixmap(Shoyu_Chicken.scaled(w6,h6,Qt::KeepAspectRatio));

    QPixmap Shio(":/new/ramen_menu/ICON/Shio.jpg");
    int w7 = ui->Shio_pic->width();
    int h7 = ui->Shio_pic->height();
    ui->Shio_pic->setPixmap(Shio.scaled(w7,h7,Qt::KeepAspectRatio));

    QPixmap Vegetarische_Shoyu(":/new/ramen_menu/ICON/veg_shoyu.png");
    int w8 = ui->Vegetarische_Shoyu_pic->width();
    int h8 = ui->Vegetarische_Shoyu_pic->height();
    ui->Vegetarische_Shoyu_pic->setPixmap(Vegetarische_Shoyu.scaled(w8,h8,Qt::KeepAspectRatio));

    QPixmap Champon(":/new/ramen_menu/ICON/Champon.jpg");
    int w9 = ui->Champon_pic->width();
    int h9 = ui->Champon_pic->height();
    ui->Champon_pic->setPixmap(Champon.scaled(w9,h9,Qt::KeepAspectRatio));

    QPixmap Seitan(":/new/ramen_menu/ICON/Seitan.jpg");
    int w10 = ui->Seitan_pic->width();
    int h10 = ui->Seitan_pic->height();
    ui->Seitan_pic->setPixmap(Seitan.scaled(w10,h10,Qt::KeepAspectRatio));

    QPixmap Tantan(":/new/ramen_menu/ICON/Tantan.png");
    int w11 = ui->Tantan_pic->width();
    int h11 = ui->Tantan_pic->height();
    ui->Tantan_pic->setPixmap(Tantan.scaled(w11,h11,Qt::KeepAspectRatio));

    QPixmap Meeresfruechte(":/new/ramen_menu/ICON/japanische-meeresfruechte-ramen-mit-tintenfischsauce_1205-11089.png");
    int w12 = ui->Meeresfruechte_pic->width();
    int h12 = ui->Meeresfruechte_pic->height();
    ui->Meeresfruechte_pic->setPixmap(Meeresfruechte.scaled(w12,h12,Qt::KeepAspectRatio));


    QPixmap Mastercard(":/new/ramen_menu/ICON/Mastercard.png");
    int w13 = ui->Master_pic->width();
    int h13 = ui->Master_pic->height();
    ui->Master_pic->setPixmap(Mastercard.scaled(w13,h13,Qt::KeepAspectRatio));

    QPixmap Amex(":/new/ramen_menu/ICON/amex.jpg");
    int w14 = ui->Amer_pic->width();
    int h14 = ui->Amer_pic->height();
    ui->Amer_pic->setPixmap(Amex.scaled(w14,h14,Qt::KeepAspectRatio));

    QPixmap Giro(":/new/ramen_menu/ICON/Giro.png");
    int w15 = ui->giro_pic->width();
    int h15 = ui->giro_pic->height();
    ui->giro_pic->setPixmap(Giro.scaled(w15,h15,Qt::KeepAspectRatio));
*/
    Display display;

    display.setImage(ui->ramen_pic, ":/re.png");
    display.setImage(ui->label_2, ":/new/ramen_menu/ICON/tonkotsu.png");
    display.setImage(ui->kimchi_pic, ":/new/ramen_menu/ICON/kimchi.png");
    display.setImage(ui->garlic_pic, ":/new/ramen_menu/ICON/marutai-kumamoto-ma-yu-black-garlic-oil-tonkotsu-instant-ramen-3-packs-japanese-taste-3.jpg");
    display.setImage(ui->Spicy_Kimchi_Miso_pic, ":/new/ramen_menu/ICON/Spicy_Kimshi_Miso.png");
    display.setImage(ui->Spicy_Kimshi_Beef_pic, ":/new/ramen_menu/ICON/spicy_kimchi.png");
    display.setImage(ui->Shoyu_Chicken_pic, ":/new/ramen_menu/ICON/Shoyu.png");
    display.setImage(ui->Shio_pic, ":/new/ramen_menu/ICON/Shio.jpg");
    display.setImage(ui->Vegetarische_Shoyu_pic, ":/new/ramen_menu/ICON/veg_shoyu.png");
    display.setImage(ui->Champon_pic, ":/new/ramen_menu/ICON/Champon.jpg");
    display.setImage(ui->Seitan_pic, ":/new/ramen_menu/ICON/Seitan.jpg");
    display.setImage(ui->Tantan_pic, ":/new/ramen_menu/ICON/Tantan.png");
    display.setImage(ui->Meeresfruechte_pic, ":/new/ramen_menu/ICON/japanische-meeresfruechte-ramen-mit-tintenfischsauce_1205-11089.png");
    display.setImage(ui->Master_pic, ":/new/ramen_menu/ICON/Mastercard.png");
    display.setImage(ui->Amer_pic, ":/new/ramen_menu/ICON/amex.jpg");
    display.setImage(ui->giro_pic, ":/new/ramen_menu/ICON/Giro.png");


    ui->stackedWidget->setCurrentIndex(0);
}

MainWindow::~MainWindow()
{
    delete ui;
    delete paymentProcessor; // Sicherstellen, dass der Speicher freigegeben wird
}

void MainWindow::on_pushButton_clicked()
{
    ui->stackedWidget->setCurrentIndex(1);
}

void MainWindow::handleDialog1()
{
    this->show();
}

void MainWindow::on_bestaetigen_2_clicked()
{
    if(ui->tonkotsu->isChecked())
    {
        selectedRamen = Tonkotsu;

    }
    else if (ui->kimchi_button->isChecked())
    {
        selectedRamen = Spicy_kimchi;
    }
    else if (ui->garlic_button->isChecked())
    {
        selectedRamen = Black_Garlic_Oil_Tonkotsu;

    }
    else if (ui->Spicy_Kimshi_Beef_button->isChecked())
    {
        selectedRamen = Spicy_Kimchi_Beef;
    }
    else if (ui->Spicy_Kimchi_Miso_button->isChecked())
    {
        selectedRamen = Spicy_Kimshi_Miso;
    }
    else if (ui->Meeresfruechte_button->isChecked())
    {
        selectedRamen = Meeresfrüchte;
    }
    else if (ui->Shio_button->isChecked())
    {
        selectedRamen = Shio;
    }
    else if (ui->Vegetarische_Shoyu_button->isChecked())
    {
        selectedRamen = Vegetarische_Shoyu;
    }
    else if (ui->Champon_button->isChecked())
    {
        selectedRamen = Champon;
    }
    else if (ui->Seitan_button->isChecked())
    {
        selectedRamen = Seitan;
    }
    else if (ui->Tantan_button->isChecked())
    {
        selectedRamen = Tantan;
    }
    else if (ui->Shoyu_Chicken_button->isChecked())
    {
        selectedRamen = Shoyu_Chicken;
    }


    else
    {
        QMessageBox::warning(this, tr("Warnung"), tr("Bitte wählen Sie den Ramen aus, um fortzufahren."));
        return;
    }





    ui->stackedWidget->setCurrentIndex(2);
}

void MainWindow::on_pushButton_2_clicked()
{
    ui->stackedWidget->setCurrentIndex(0);
}

void MainWindow::on_radioButtonCard_toggled(bool checked)
{
    ui->cardButtonsWidget->setVisible(checked);
    ui->cashButtonsWidget->setVisible(!checked);
}

void MainWindow::on_radioButtonCash_toggled(bool checked)
{
    ui->cashButtonsWidget->setVisible(checked);
    ui->cardButtonsWidget->setVisible(!checked);
}

void MainWindow::on_cardButton_clicked()
{
    //qDebug() << "Card button clicked"; // Debugging-Ausgabe
    //paymentProcessor->processCardPayment();

    QPushButton* button = qobject_cast<QPushButton*>(sender());
    if (button)
    {
        QString buttonText = button->text();
        qDebug() << "Card button clicked: " << buttonText; // Debugging-Ausgabe
        paymentProcessor->processCardPayment();
       // ui->labelCardStatus->setText("Card button clicked: " + buttonText);
    }
}

void MainWindow::on_cashButton_clicked()
{
    QPushButton* button = qobject_cast<QPushButton*>(sender());
    if (button)
    {
        double amount = button->text().replace("€", "").toDouble();
        qDebug() << "Cash button clicked: " << amount; // Debugging-Ausgabe
        paymentProcessor->processCashPayment(amount);
    }
}

void MainWindow::updatePaidAmount(double amount)
{
    ui->labelPaidAmount->setText(QString::number(amount) + " €");
}

void MainWindow::showPaymentSuccessMessage()
{
    double change = paymentProcessor->getChange();
     QString message = QString("Vielen Dank für Ihre Zahlung! Rückgeld: %1 €").arg(change);
    QMessageBox::information(this, "Bezahlung erfolgreich", "Vielen Dank für Ihre Zahlung!");
    //paymentProcessor->reset();
    updatePaidAmount(paymentProcessor->getPaidAmount());
}

void MainWindow::on_pushButton_7_clicked()
{

    if(ui->soy_button->isChecked())
    {
        selectedSauce = Soy;

    }
    else if (ui->fish_button->isChecked())
    {
        selectedSauce = Fish;
    }
    else if (ui->hoisin_button->isChecked())
    {
        selectedSauce = Hoisin;
    }
    else if (ui->sambal_button->isChecked())
    {
        selectedSauce = Sambal;
    }
    else if (ui->chilioil_button->isChecked())
    {
        selectedSauce = Chili_Oil;
    }
        else if (ui->chilicrisp_button->isChecked())
    {
        selectedSauce = Chili_Crisp;
    }
    else
    {
        QMessageBox::warning(this, tr("Warnung"), tr("Bitte wählen Sie den Ramen aus, um fortzufahren."));
        return;
    }




    updateLabels();
    ui->stackedWidget->setCurrentIndex(3);
}

//Zubereitung

void MainWindow::on_buttonSelectRamen_clicked()
{
    // Beispielcode zur Auswahl einer Ramenart
    // Hier sollten Sie einen Dialog oder ein Auswahlmenü öffnen
    // Für dieses Beispiel setzen wir einfach einen Wert
    selectedRamen = Black_Garlic_Oil_Tonkotsu;  // Beispielauswahl
    updateLabels();
}

void MainWindow::on_buttonSelectSauce_clicked()
{
    // Beispielcode zur Auswahl einer Soßeart
    // Hier sollten Sie einen Dialog oder ein Auswahlmenü öffnen
    // Für dieses Beispiel setzen wir einfach einen Wert
    selectedSauce = Hoisin;  // Beispielauswahl
    updateLabels();
}

void MainWindow::updateLabels()
{
    // Update labels to show the selected Ramen and Sauce

    QString ramenName;
    switch (selectedRamen) {
    case Tonkotsu:
        ramenName = "Tonkotsu";

        break;
    case Black_Garlic_Oil_Tonkotsu:
        ramenName = "Black Garlic Oil Tonkotsu";

        break;
    case Spicy_Kimchi_Beef:
        ramenName = "Black Garlic Oil Tonkotsu";
        break;
    case Meeresfrüchte:
        ramenName = "Meeresfrüchte";
        break;
    case Spicy_kimchi:
        ramenName = "Spicy_Kimchi_Beef";
        break;
    case Spicy_Kimshi_Miso:
        ramenName = "Spicy_Kimshi_Miso";
        break;
    case Shoyu_Chicken:
        ramenName = "Shoyu_Chicken";
        break;
    case Shio:
        ramenName = "Shio";
        break;
    case Vegetarische_Shoyu:
        ramenName = "Vegetarische_Shoyu";
        break;
    case Champon:
        ramenName = "Champon";
        break;
    case Seitan:
        ramenName = "Seitan";
        break;
    case Tantan:
        ramenName = "Tantan";
        break;




    default: ramenName = "Unbekannte Ramenart"; break;
    }

    QString sauceName;
    switch (selectedSauce) {
    case Soy: sauceName = "Soy";  break;
    case Hoisin: sauceName = "Hoisin"; break;
    case Fish: sauceName = "Fish"; break;
    case Chili_Oil: sauceName = "Chili_Oil"; break;
    case Sambal: sauceName = "Sambal"; break;
    case Chili_Crisp: sauceName = "Chili_Crisp"; break;
    // Weitere Fälle hier hinzufügen...
    default: sauceName = "Unbekannte Soßeart"; break;
    }
    //double final = price +preis;
    Zubereitung zubereitung(selectedRamen, selectedSauce);
    double final = zubereitung.getprice();
    paymentProcessor->setTotalAmount(final);
    ui->labelTotalAmount->setText(QString::number(paymentProcessor->getTotalAmount()) + " €");
    ui->labelSelectedRamen->setText("Selected Ramen: " + ramenName);
    ui->labelSelectedSauce->setText("Selected Sauce: " + sauceName);
}

void MainWindow::on_buttonConfirmSelection_clicked()
{
    Zubereitung *zubereitung = new Zubereitung(selectedRamen, selectedSauce);
    if (paymentProcessor != nullptr) {
        delete paymentProcessor;  // Vorherige Instanz löschen, um Speicherlecks zu vermeiden
    }
    paymentProcessor = new PaymentProcessor(zubereitung, this);
    updateLabels();

    // Hier können Sie den Preis anzeigen oder andere Aktionen durchführen
    ui->labelTotalAmount->setText(QString::number(paymentProcessor->getTotalAmount()) + " €");
    ui->labelPaidAmount->setText(QString::number(paymentProcessor->getPaidAmount()) + " €");
}
/*
void MainWindow::on_buttonCash5_clicked()
{
    int amount = 5; // Der Wert 5 entspricht dem 5€-Schein
    paymentProcessor->processCashPayment(amount);
}


*/

void MainWindow::on_pushButton_3_clicked()
{
    if (ui->radioButton_2->isChecked())
        selectedGeldschein = GeldscheinTyp::Zehn;

}

void MainWindow::checkCashBalance()
{
    double cashBalance = paymentProcessor->getCashBalance();
    QMessageBox::information(this, tr("Cash Balance"), tr("Current cash balance: %1 €").arg(cashBalance));
}

void MainWindow::clearCashBalance()
{
    paymentProcessor->clearCashBalance();
    QMessageBox::information(this, tr("Cash Balance Cleared"), tr("The cash balance has been cleared."));
}

void MainWindow::on_pushButton_4_clicked()
{
    ui->stackedWidget->setCurrentIndex(0);

}




/*void MainWindow::on_startSimulationButton_clicked()
{
    if (!secondwindow) {
        secondwindow = new Dialog1(this);
    }
    secondwindow->startSimulation();
    secondwindow->show();
}*/
void MainWindow::on_startSimulationButton_clicked()
{
    if (!secondwindow) {
        secondwindow = new Dialog1(this);
    }

    // Positioniere das zweite Fenster neben dem Hauptfenster
    QPoint mainWindowPos = this->pos();
    QSize mainWindowSize = this->size();
    int secondWindowX = mainWindowPos.x() + mainWindowSize.width();
    int secondWindowY = mainWindowPos.y();
    secondwindow->move(secondWindowX, secondWindowY);

    secondwindow->startSimulation();
    secondwindow->show();
}

void MainWindow::updateChangeLabel()
{
    double change = paymentProcessor->getChange();
    ui->changeLabel->setText(QString("Rückgeld: %1 €").arg(change));
    paymentProcessor->reset();
}