#pragma once

#include <iostream>

#include "TApplication.h"
#include "TCanvas.h"
#include "TMath.h"
#include "TH2F.h"
#include "TGraph.h"
#include "TStyle.h"
#include "TEllipse.h"

#include "../Headers/setup.h"

class Image
{
private:
    TH2D* histo;
    void initDrawImage();
    // gridlines
    const int Nl = 19; // Number of drawn latitudes
    const int NL = 19; // Number of drawn longitudes
    int M  = 30;
    std::vector<TGraph*> latitudes;
    std::vector<TGraph*> longitudes;
    void drawGridlines();
    // source marker
    TEllipse* sourceMarker;
    void drawSource();
public:
    // bool finished=false;
    const Setup* config;
    TCanvas* canvas;
    void addCone(const std::vector<Cone> cones);
    // void closed() { std::cout << "Close app" << '\n'; finished = true; gApplication->Terminate(0);}
    Image(const Setup* config_): config(config_) {
        initDrawImage();
        drawGridlines();
        drawSource();
    }
    ~Image(){
        if (canvas)
            delete canvas;
        if (histo)
            delete histo;
        for (int i = 0; i < Nl; i++)
        {
            if (latitudes[i])
                delete latitudes[i];
        }
        for (int i = 0; i < NL; i++)
        {
            if (longitudes[i])
                delete longitudes[i];
        }
        if (!sourceMarker)
        {
            delete sourceMarker;
        }
        
    }

    // ClassDef(Image,0)
};

int Backprojection(const Setup* config, const std::vector<Cone>& cones, 
                   std::vector<std::vector<double>>& image);

int drawImage(const Setup* config, const std::vector<std::vector<double>>& image);

// convert cartesian to worldmap coordinates
int aitoff2xy(const double& l, const double& b, double &Al, double &Ab);