#include "setup.h"
#include "QDebug"
#include "QDir"
Setup::Setup(const QString initFile)
    : settingPath(initFile)
{
    readSetup(settingPath);
}
void Setup::readSetup(const QString path)
{
    settingPath = path;
    QSettings settings(path, QSettings::IniFormat);
    filePath = settings.value("File").toString();
//    filePath = ":/Data/Data/pulses.txt";
//    filePath = "/media/ming/DATA/projects/Postprocessing/simulation_2/pulses_with_pos_sort_by_time.txt";
    // filePath = "/media/ming/DATA/projects/Postprocessing/simulation_3/pulses_with_pos_sort_by_time.txt";
//    filePath = "/home/mingf2/Downloads/pulses_with_pos_sort_by_time.txt";
    inputFormat = settings.value("InputFormat").toString();
    runID = settings.value("RunID").toString();
    outputDir = QDir(runID);
    maxN = settings.value("MaxEventNum").toInt();


    settings.beginGroup("DataSaving");
    saveImage = settings.value("SaveImage").toBool();
    saveSpectrum = settings.value("SaveSpectrum").toBool();
    saveImageFormat = settings.value("ImageFormat").toString();
    saveSpectrumFormat = settings.value("SpectrumFormat").toString();
    settings.endGroup();

    settings.beginGroup("ImageSpace");
    R = settings.value("Radius").toDouble();
    R = std::sqrt(3.6*3.6+10*10+0);
//    R= 50;
    phiBins = settings.value("NPhiBins").toInt();
    phiMax = settings.value("PhiMax").toDouble();
    phiMax *= M_PI / 180;
    phiMin = settings.value("PhiMin").toDouble();
    phiMin *= M_PI / 180;
    thetaBins = settings.value("NThetaBins").toInt();
    thetaMax = settings.value("ThetaMax").toDouble();
    thetaMax *= M_PI / 180;
    thetaMin = settings.value("ThetaMin").toDouble();
    thetaMin *= M_PI / 180;
    settings.endGroup();

    settings.beginGroup("EnergySpectrum");
    ergBins = settings.value("NEneregyBins").toInt();
    ergMin  =settings.value("EnergyMin").toDouble();
    ergMax = settings.value("EnergyMax").toDouble();
    settings.endGroup();

    if (channelSettings.size()>0)
        channelSettings.clear();
    settings.beginGroup("Channels");
    QStringList keys = settings.childKeys();
//    foreach (QString key, keys) {
//        channelSettings[QVariant(key).toInt()] = QVariant(settings.value(key)).value<Channel>();
//    }
    foreach (QString key, keys) {
        channelSettings.append(QVariant(settings.value(key)).value<Channel>());
    }
    std::sort(channelSettings.begin(), channelSettings.end(),
              [](const Channel & a, const Channel & b) -> bool
    {
        return a.chNum < b.chNum;
    });
    for (int i=0;i<channelSettings.size();i++)
        qDebug() << channelSettings[i].chNum << channelSettings[i].x << channelSettings[i].y << channelSettings[i].enabled << channelSettings[i].caliCoef << '\n';
    settings.endGroup();

    settings.beginGroup("Rejections");
    energyCut = settings.value("EnergyCut").toBool();
    energyLow = settings.value("EnergyLowerThreshold").toDouble();
    energyUp = settings.value("EnergyUpperThreshold").toDouble();
    settings.endGroup();

    settings.beginGroup("Coincidence");
    timeWindow = settings.value("TimeWindow").toDouble();
    settings.endGroup();

}
void Setup::writeSetup(const QString path) const
{
    QSettings settings(path, QSettings::IniFormat);
    settings.setValue("File", filePath);
    settings.setValue("InputFormat", inputFormat);
    settings.setValue("RunID", runID);
    settings.setValue("MaxEventNum", maxN);

    settings.beginGroup("ImageSpace");
    settings.setValue("Radius", R);
    settings.setValue("NPhiBins", phiBins);
    settings.setValue("PhiMin", std::round( phiMin * 180 / M_PI));
    settings.setValue("PhiMax", std::round( phiMax * 180 / M_PI));
    settings.setValue("ThetaMin", std::round( thetaMin * 180 / M_PI));
    settings.setValue("ThetaMax", std::round( thetaMax * 180 / M_PI));
    settings.setValue("NThetaBins", thetaBins);
    settings.endGroup();

    settings.beginGroup("EnergySpectrum");
    settings.setValue("NEneregyBins", ergBins);
    settings.setValue("EnergyMin", ergMin);
    settings.setValue("EnergyMax", ergMax);
    settings.endGroup();

    settings.beginGroup("Channels");
//    for (auto i= 0;i < channelSettings.size();i++){
//        settings.setValue(QVariant(i).toString(), QVariant::fromValue(channelSettings[i]));
//    }
    for (int i=0;i<channelSettings.size();i++){
        settings.setValue(QString::number(i), QVariant::fromValue(channelSettings[i]));
    }
    settings.endGroup();

    settings.beginGroup("Rejections");
    settings.setValue("EnergyCut", energyCut);
    settings.setValue("EnergyLowerThreshold", energyLow);
    settings.setValue("EnergyUpperThreshold", energyUp);
    settings.endGroup();

    settings.beginGroup("Coincidence");
    settings.setValue("TimeWindow", timeWindow);
    settings.endGroup();

    settings.beginGroup("DataSaving");
    settings.setValue("SaveImage", saveImage);
    settings.setValue("SaveSpectrum", saveSpectrum);
    settings.setValue("ImageFormat", saveImageFormat);
    settings.setValue("SpectrumFormat", saveSpectrumFormat);
    settings.endGroup();
}

Setup::~Setup()
{
    qDebug() << "save settings to disk";
//    qDebug() << QDir::current();
    writeSetup();
    qDebug() << "settings saved";
}