#include "camconfig.h"
#include "mylogger.h"
#include "util.h"


CamConfigurator::CamConfigurator(Pylon::DeviceInfoList &deviceList, QWidget *parent) :
    deviceList(deviceList), QDialog(parent), preview(nullptr) {
    mode_combo = new QComboBox(this);
    mode_combo->addItem("camera mode");
    mode_combo->addItem("single camera");
    if (deviceList.size() > 1){
        mode_combo->addItem("stereo camera");
    }
    connect(mode_combo, SIGNAL(currentIndexChanged(int)), SLOT(modeChanged(int)));

    device_combo = new QComboBox(this);
    for (auto d : deviceList) {
        device_combo->addItem(QString(d.GetFullName().c_str()));
    }
    connect(device_combo, SIGNAL(currentIndexChanged(int)), SLOT(primaryDeviceChanged(int)));

    // orientation_combo = new QComboBox(this);
    // orientation_combo->addItem("Vertical");
    // orientation_combo->addItem("Horizontal");
    // orientation_combo->setEnabled(false);
    // connect(orientation_combo, SIGNAL(currentIndexChanged(int)), SLOT(orientationChanged(int)));

    QWidget *header = new QWidget(this);
    QGridLayout *grid = new QGridLayout(header);
    grid->addWidget(new QLabel("Recording mode:", this), 0, 0);
    grid->addWidget(mode_combo, 0, 1);
    grid->addWidget(new QLabel("Primary device:", this), 1, 0);
    grid->addWidget(device_combo, 1, 1);
    header->setLayout(grid);

    QVBoxLayout *vbox = new QVBoxLayout(this);
    vbox->addWidget(header);
    stack = new QStackedWidget(this);
    stack->addWidget(new QLabel("CameraSetup, select mode!"));
    stack->setCurrentIndex(0);
    vbox->addWidget(stack);

    buttonbox = new QDialogButtonBox(QDialogButtonBox::Ok
                                   | QDialogButtonBox::Cancel);
    connect(buttonbox, &QDialogButtonBox::accepted, this, &QDialog::accept);
    connect(buttonbox, &QDialogButtonBox::rejected, this, &QDialog::reject);
    vbox->addWidget(buttonbox);
}


CameraSetup* CamConfigurator::singleCameraView() {
    qInfo() << "Create Single Camera configuration!";
    if (preview != nullptr) {
        delete preview;
        preview = nullptr;
    }
    preview = new SingleCamera(this);
    return preview;
}


CameraSetup* CamConfigurator::stereoCameraView() {
    qInfo() << "Create stereoCameraConfiguration";
    if (preview != nullptr) {
        delete preview;
        preview = nullptr;
    }
    preview = new DualCamera(this);
    return preview;
}


void CamConfigurator::modeChanged(int idx) {
    stack->setCurrentIndex(0);
    if (stack->count() > 1 && preview != nullptr) {
        qDebug() << "removing previous widget from stack";
        stack->removeWidget(preview);
        delete preview;
        preview == nullptr;
    }
    if (idx == 1) {
        qDebug() << "Mode changed to single camera mode";
        qDebug() << "add new single camera preview";
        preview = singleCameraView();
        stack->addWidget(preview);
        stack->setCurrentIndex(1);
        QString device = device_combo->currentText();
        preview->setPrimaryCamera(device);
        mode_combo->setEnabled(false);
    } else if (idx == 2) {
        qDebug() << "Mode changed to dual camera mode";
        preview = stereoCameraView();
        stack->addWidget(preview);
        stack->setCurrentIndex(1);

        QString device1 = device_combo->currentText();
        preview->setPrimaryCamera(device1);
        int i = device_combo->currentIndex();
        if (i > 1) {
            i = 1;
        }
        QString device2 = device_combo->itemText(1 - i);
        preview->setSecondaryCamera(device2);
        mode_combo->setEnabled(false);
    } else {
        qDebug() << "Mode changed mode selection";
        stack->setCurrentIndex(0);
    }
}


// void CamConfigurator::orientationChanged(int idx) {

// }


void CamConfigurator::primaryDeviceChanged(int idx) {
    if (mode_combo->currentText() == "single camera") { // single camera setting
        QString devicename = device_combo->currentText();
        preview->setPrimaryCamera(devicename);
    } else {
        preview->switchArrangement();
    }
}

CameraLayout CamConfigurator::layout(){
    CameraLayout l;
    qDebug() << "Request layout";
    return preview->cameraLayout();
}

CamConfigurator::~CamConfigurator()
{   
    qDebug() << "CamConfig Destructor";
    delete preview;
}