#include "FrameArquivo.h"

//(*InternalHeaders(FrameArquivo)
#include <wx/string.h>
#include <wx/intl.h>
#include <wx/bitmap.h>
#include <wx/image.h>
#include <wx/artprov.h>
//*)

#include <wx/filename.h>
#include <wx/control.h>
#include <wx/sizer.h>
#include <wx/statbox.h>
#include <sstream>
#include <iostream>
#include <iomanip>

#include "Principal.h"
#include "Arquivo.h"
#include "Utils.h"

//(*IdInit(FrameArquivo)
const long FrameArquivo::ID_GRID1 = wxNewId();
const long FrameArquivo::ID_TOOLBARITEM1 = wxNewId();
const long FrameArquivo::ID_TOOLBARITEM6 = wxNewId();
const long FrameArquivo::ID_TOOLBARITEM2 = wxNewId();
const long FrameArquivo::ID_TOOLBARITEM3 = wxNewId();
const long FrameArquivo::ID_TOOLBARITEM4 = wxNewId();
const long FrameArquivo::ID_TOOLBARITEM5 = wxNewId();
const long FrameArquivo::ID_TOOLBAR1 = wxNewId();
//*)

BEGIN_EVENT_TABLE(FrameArquivo,wxFrame)
	//(*EventTable(FrameArquivo)
	//*)
END_EVENT_TABLE()

FrameArquivo::FrameArquivo(wxWindow* parent,wxWindowID id,const wxPoint& pos,const wxSize& size)
{
	BuildContent(parent,id,pos,size);
}

void FrameArquivo::BuildContent(wxWindow* parent,wxWindowID id,const wxPoint& pos,const wxSize& size)
{
	//(*Initialize(FrameArquivo)
	Create(parent, wxID_ANY, _("Simulações"), wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_STYLE, _T("wxID_ANY"));
	SetClientSize(wxSize(1300,400));
	Grid1 = new wxGrid(this, ID_GRID1, wxPoint(8,192), wxSize(1300,752), wxRAISED_BORDER, _T("ID_GRID1"));
	Grid1->CreateGrid(0,15);
	Grid1->EnableEditing(true);
	Grid1->EnableGridLines(true);
	Grid1->SetLabelTextColour(wxColour(222,33,33));
	Grid1->SetColLabelValue(0, _("N"));
	Grid1->SetColLabelValue(1, _("X"));
	Grid1->SetColLabelValue(2, _("Y"));
	Grid1->SetColLabelValue(3, _("DS"));
	Grid1->SetColLabelValue(4, _("DSS"));
	Grid1->SetColLabelValue(5, _("US"));
	Grid1->SetColLabelValue(6, _("E1"));
	Grid1->SetColLabelValue(7, _("E2"));
	Grid1->SetColLabelValue(8, _("T1"));
	Grid1->SetColLabelValue(9, _("T2"));
	Grid1->SetColLabelValue(10, _("T3"));
	Grid1->SetColLabelValue(11, _("T4"));
	Grid1->SetColLabelValue(12, _("T5"));
	Grid1->SetColLabelValue(13, _("R2"));
	Grid1->SetColLabelValue(14, _("RMS"));
	Grid1->SetDefaultCellFont( Grid1->GetFont() );
	Grid1->SetDefaultCellTextColour( Grid1->GetForegroundColour() );
	ToolBar1 = new wxToolBar(this, ID_TOOLBAR1, wxDefaultPosition, wxDefaultSize, wxTB_HORIZONTAL|wxNO_BORDER, _T("ID_TOOLBAR1"));
	ToolBarItem1 = ToolBar1->AddTool(ID_TOOLBARITEM1, _("Novo"), wxArtProvider::GetBitmap(wxART_MAKE_ART_ID_FROM_STR(_T("wxART_NEW")),wxART_TOOLBAR), wxNullBitmap, wxITEM_NORMAL, _("Novo"), wxEmptyString);
	ToolBarItem6 = ToolBar1->AddTool(ID_TOOLBARITEM6, _("Remover"), wxArtProvider::GetBitmap(wxART_MAKE_ART_ID_FROM_STR(_T("wxART_DELETE")),wxART_TOOLBAR), wxNullBitmap, wxITEM_NORMAL, wxEmptyString, wxEmptyString);
	ToolBarItem2 = ToolBar1->AddTool(ID_TOOLBARITEM2, _("Importar"), wxArtProvider::GetBitmap(wxART_MAKE_ART_ID_FROM_STR(_T("wxART_FILE_OPEN")),wxART_TOOLBAR), wxNullBitmap, wxITEM_NORMAL, _("Importar"), wxEmptyString);
	ToolBarItem3 = ToolBar1->AddTool(ID_TOOLBARITEM3, _("Exportar"), wxArtProvider::GetBitmap(wxART_MAKE_ART_ID_FROM_STR(_T("wxART_FILE_SAVE")),wxART_TOOLBAR), wxNullBitmap, wxITEM_NORMAL, _("Exportar"), wxEmptyString);
	ToolBarItem4 = ToolBar1->AddTool(ID_TOOLBARITEM4, _("Simular"), wxArtProvider::GetBitmap(wxART_MAKE_ART_ID_FROM_STR(_T("wxART_EXECUTABLE_FILE")),wxART_TOOLBAR), wxNullBitmap, wxITEM_NORMAL, _("Simular"), wxEmptyString);
	ToolBar1->AddSeparator();
	ToolBarItem5 = ToolBar1->AddTool(ID_TOOLBARITEM5, _("Sair"), wxArtProvider::GetBitmap(wxART_MAKE_ART_ID_FROM_STR(_T("wxART_QUIT")),wxART_TOOLBAR), wxNullBitmap, wxITEM_NORMAL, _("Sair"), wxEmptyString);
	ToolBar1->Realize();
	SetToolBar(ToolBar1);
	FileDialog1 = new wxFileDialog(this, _("Select file"), wxEmptyString, wxEmptyString, _("*.dat"), wxFD_OPEN|wxFD_FILE_MUST_EXIST|wxFD_CHANGE_DIR, wxDefaultPosition, wxDefaultSize, _T("wxFileDialog"));
	FileDialog2 = new wxFileDialog(this, _("Select file"), wxEmptyString, wxEmptyString, _("*.dat"), wxFD_SAVE|wxFD_OVERWRITE_PROMPT|wxFD_CHANGE_DIR, wxDefaultPosition, wxDefaultSize, _T("wxFileDialog"));

	Connect(ID_GRID1,wxEVT_GRID_CELL_CHANGE,(wxObjectEventFunction)&FrameArquivo::OnGrid1CellChange);
	Connect(wxID_ANY,wxEVT_CLOSE_WINDOW,(wxObjectEventFunction)&FrameArquivo::OnClose);
	//*)

	Connect(ID_TOOLBARITEM1,wxEVT_TOOL,(wxObjectEventFunction)&FrameArquivo::OnToolItem1);
	Connect(ID_TOOLBARITEM6,wxEVT_TOOL,(wxObjectEventFunction)&FrameArquivo::OnToolItem6);
	Connect(ID_TOOLBARITEM2,wxEVT_TOOL,(wxObjectEventFunction)&FrameArquivo::OnToolItem2);
	Connect(ID_TOOLBARITEM3,wxEVT_TOOL,(wxObjectEventFunction)&FrameArquivo::OnToolItem3);
	Connect(ID_TOOLBARITEM4,wxEVT_TOOL,(wxObjectEventFunction)&FrameArquivo::OnToolItem4);
	Connect(ID_TOOLBARITEM5,wxEVT_TOOL,(wxObjectEventFunction)&FrameArquivo::OnClose);

	int i,
        cols=Grid1->GetNumberCols();
    for (i=0; i<cols; ++i) {
        if (i==0)       Grid1->SetColFormatNumber(i);
        else if (i>2)   Grid1->SetColFormatFloat(i,CAMPO,PRECISAO);
    }

}

FrameArquivo::~FrameArquivo()
{
	//(*Destroy(FrameArquivo)
	//*)
}

void FrameArquivo::OnClose(wxCloseEvent& event)
{
    Destroy();
}

// Novo
void FrameArquivo::OnToolItem1(wxCommandEvent& event)
{
    int linha;
    Simulacao reg = {0,{},{},0.0,0.0,0.0,0.0};
    simul.push_back(reg);

    linha = limpaEntrada(Grid1);
    SetEntrada(Grid1, linha);
    iniciaCelulas(Grid1);
}

// Remover
void FrameArquivo::OnToolItem6(wxCommandEvent& event)
{
    int i;
    wxArrayInt linhas = Grid1->GetSelectedRows();

    for(i=0; i<linhas.size(); ++i) {
        Grid1->DeleteRows(linhas[i],1);
        simul.erase(simul.begin()+linhas[i]);
    }
}

// Importar
void FrameArquivo::OnToolItem2(wxCommandEvent& event)
{
    int linha, i;
    if(FileDialog1->ShowModal() == wxID_OK) {
        if (readArq(FileDialog1->GetPath().ToStdString())) {
            if (Grid1->GetNumberRows())
                Grid1->DeleteRows(0,Grid1->GetNumberRows());

            for (i=0; i < simul.size(); ++i) {
                linha = limpaEntrada(Grid1);
                SetEntrada(Grid1, linha);
                limpaSaida(Grid1, linha);
            }
            Grid1->AutoSizeRows();
            iniciaCelulas(Grid1);
        }
    }
}

// Exportar
void FrameArquivo::OnToolItem3(wxCommandEvent& event)
{
    if(FileDialog2->ShowModal() == wxID_OK)
        saveArq(FileDialog2->GetPath().ToStdString());
}

// EXECUTAR
void FrameArquivo::OnToolItem4(wxCommandEvent& event)
{
    int i;
    wxArrayInt linhas = Grid1->GetSelectedRows();

    for(i=0; i<linhas.size(); ++i) {
        limpaSaida(Grid1, linhas[i]);
//        GetEntrada(Grid1, linhas[i]);
        regIdx = linhas[i];
        principal();
        SetSaida(Grid1, linhas[i]);

        Grid1->AutoSizeRows();
    }
}


void FrameArquivo::OnGrid1CellChange(wxGridEvent& event)
{
        GetEntrada(Grid1, event.GetRow());
}
