#include "compilerpatternspage.h"
#include "build_settings_config.h"
#include "compiler.h"
#include "globals.h"
#include "windowattrmanager.h"

CompilerPatternsPage::CompilerPatternsPage( wxWindow* parent, const wxString &cmpname )
		: CompilerPatternsBase( parent )
		, m_cmpname(cmpname)
{
	m_listErrPatterns->InsertColumn(0,  _("Pattern"));
	m_listErrPatterns->InsertColumn(1,  _("File name index"));
	m_listErrPatterns->InsertColumn(2,  _("Line number index"));

	m_listWarnPatterns->InsertColumn(0,  _("Pattern"));
	m_listWarnPatterns->InsertColumn(1,  _("File name index"));
	m_listWarnPatterns->InsertColumn(2,  _("Line number index"));

	CompilerPtr cmp = BuildSettingsConfigST::Get()->GetCompiler(m_cmpname);

	const Compiler::CmpListInfoPattern& errPatterns = cmp->GetErrPatterns();
	Compiler::CmpListInfoPattern::const_iterator itPattern;
	for (itPattern = errPatterns.begin(); itPattern != errPatterns.end(); ++itPattern) {
		long item = AppendListCtrlRow(m_listErrPatterns);
		SetColumnText(m_listErrPatterns, item, 0,  itPattern->pattern);
		SetColumnText(m_listErrPatterns, item, 1, itPattern->fileNameIndex);
		SetColumnText(m_listErrPatterns, item, 2, itPattern->lineNumberIndex);
	}

	const Compiler::CmpListInfoPattern& warnPatterns = cmp->GetWarnPatterns();
	for (itPattern = warnPatterns.begin(); itPattern != warnPatterns.end(); ++itPattern) {
		long item = AppendListCtrlRow(m_listWarnPatterns);
		SetColumnText(m_listWarnPatterns, item, 0,  itPattern->pattern);
		SetColumnText(m_listWarnPatterns, item, 1, itPattern->fileNameIndex);
		SetColumnText(m_listWarnPatterns, item, 2, itPattern->lineNumberIndex);
	}

	m_listWarnPatterns->SetColumnWidth(0, 200);
	m_listWarnPatterns->SetColumnWidth(1, 50);
	m_listWarnPatterns->SetColumnWidth(2, 50);

	m_listErrPatterns->SetColumnWidth(0, 200);
	m_listErrPatterns->SetColumnWidth(1, 50);
	m_listErrPatterns->SetColumnWidth(2, 50);
}

void CompilerPatternsPage::Save(CompilerPtr cmp)
{
	Compiler::CmpListInfoPattern errPatterns;
	for (int i = 0; i < m_listErrPatterns->GetItemCount(); ++i) {
		Compiler::CmpInfoPattern infoPattern;
		infoPattern.pattern         = GetColumnText(m_listErrPatterns, i, 0);
		infoPattern.fileNameIndex   = GetColumnText(m_listErrPatterns, i, 1);
		infoPattern.lineNumberIndex = GetColumnText(m_listErrPatterns, i, 2);
		errPatterns.push_back(infoPattern);
	}
	cmp->SetErrPatterns(errPatterns);

	Compiler::CmpListInfoPattern warnPatterns;
	for (int i = 0; i < m_listWarnPatterns->GetItemCount(); ++i) {
		Compiler::CmpInfoPattern infoPattern;
		infoPattern.pattern         = GetColumnText(m_listWarnPatterns, i, 0);
		infoPattern.fileNameIndex   = GetColumnText(m_listWarnPatterns, i, 1);
		infoPattern.lineNumberIndex = GetColumnText(m_listWarnPatterns, i, 2);
		warnPatterns.push_back(infoPattern);
	}
	cmp->SetWarnPatterns(warnPatterns);
}

void CompilerPatternsPage::OnBtnAddErrPattern( wxCommandEvent& event )
{
	CompilerPatternDlg dlg(this, _("Add compiler error pattern"));
	if (dlg.ShowModal() == wxID_OK) {
		long item = AppendListCtrlRow( m_listErrPatterns );
		SetColumnText(m_listErrPatterns, item, 0, dlg.m_pattern);
		SetColumnText(m_listErrPatterns, item, 1, dlg.m_fileIdx);
		SetColumnText(m_listErrPatterns, item, 2, dlg.m_lineIdx);
	}
}

void CompilerPatternsPage::OnBtnDelErrPattern( wxCommandEvent& event )
{
	int sel =  m_listErrPatterns->GetNextItem(-1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
	if (sel == wxNOT_FOUND) {
		return;
	}
	m_listErrPatterns->DeleteItem(sel);
}

void CompilerPatternsPage::OnBtnUpdateErrPattern( wxCommandEvent& event )
{
	int sel = m_listErrPatterns->GetNextItem(-1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
	if (sel == wxNOT_FOUND) {
		return;
	}
	DoUpdateErrPattern(sel);
}

void CompilerPatternsPage::OnErrItemActivated( wxListEvent& event )
{
	wxLogMessage(wxT("CompilerPatternsPage::OnErrItemActivated(%d)"), event.GetIndex());
	DoUpdateErrPattern(event.GetIndex());
}

void CompilerPatternsPage::DoUpdateErrPattern(long item)
{
	wxString pattern = GetColumnText(m_listErrPatterns, item, 0);
	wxString fileIdx = GetColumnText(m_listErrPatterns, item, 1);
	wxString lineIdx = GetColumnText(m_listErrPatterns, item, 2);
	CompilerPatternDlg dlg(this, _("Update compiler error pattern"));
	dlg.SetPattern(pattern, lineIdx, fileIdx);
	if (dlg.ShowModal() == wxID_OK) {
		SetColumnText(m_listErrPatterns, item, 0,  dlg.m_pattern);
		SetColumnText(m_listErrPatterns, item, 1, dlg.m_fileIdx);
		SetColumnText(m_listErrPatterns, item, 2, dlg.m_lineIdx);
	}
}

void CompilerPatternsPage::OnBtnAddWarnPattern( wxCommandEvent& event )
{
	CompilerPatternDlg dlg(this, _("Add compiler warning pattern"));
	if (dlg.ShowModal() == wxID_OK) {
		long item = AppendListCtrlRow( m_listWarnPatterns );
		SetColumnText(m_listWarnPatterns, item, 0, dlg.m_pattern);
		SetColumnText(m_listWarnPatterns, item, 1, dlg.m_fileIdx);
		SetColumnText(m_listWarnPatterns, item, 2, dlg.m_lineIdx);
	}
}

void CompilerPatternsPage::OnBtnDelWarnPattern( wxCommandEvent& event )
{
	int sel = m_listWarnPatterns->GetNextItem(-1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
	if (sel == wxNOT_FOUND) {
		return;
	}
	m_listWarnPatterns->DeleteItem(sel);
}

void CompilerPatternsPage::OnBtnUpdateWarnPattern( wxCommandEvent& event )
{
	int sel = m_listWarnPatterns->GetNextItem(-1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
	if (sel == wxNOT_FOUND) {
		return;
	}
	DoUpdateWarnPattern(sel);
}

void CompilerPatternsPage::OnWarnItemActivated( wxListEvent& event )
{
	DoUpdateWarnPattern(event.GetIndex());
}

void CompilerPatternsPage::DoUpdateWarnPattern(long item)
{
	wxString pattern = GetColumnText(m_listWarnPatterns, item, 0);
	wxString fileIdx = GetColumnText(m_listWarnPatterns, item, 1);
	wxString lineIdx = GetColumnText(m_listWarnPatterns, item, 2);
	CompilerPatternDlg dlg(this, _("Update compiler warning pattern"));
	dlg.SetPattern(pattern, lineIdx, fileIdx);
	if (dlg.ShowModal() == wxID_OK) {
		SetColumnText(m_listWarnPatterns, item, 0,  dlg.m_pattern);
		SetColumnText(m_listWarnPatterns, item, 1, dlg.m_fileIdx);
		SetColumnText(m_listWarnPatterns, item, 2, dlg.m_lineIdx);
	}
}

void CompilerPatternsPage::OnErrorPatternSelectedUI(wxUpdateUIEvent& event)
{
	int sel = m_listErrPatterns->GetNextItem(-1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
	event.Enable(sel != wxNOT_FOUND);
}

void CompilerPatternsPage::OnWarningPatternSelectedUI(wxUpdateUIEvent& event)
{
	int sel = m_listWarnPatterns->GetNextItem(-1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
	event.Enable(sel != wxNOT_FOUND);
}

CompilerPatternDlg::CompilerPatternDlg(wxWindow* parent, const wxString& title)
: CompilerPatternDlgBase(parent, wxID_ANY, title)
{
	WindowAttrManager::Load(this, wxT("CompilerPatternDlg"), NULL);
}

CompilerPatternDlg::~CompilerPatternDlg()
{
	WindowAttrManager::Save(this, wxT("CompilerPatternDlg"), NULL);
}

void CompilerPatternDlg::SetPattern(const wxString& pattern, const wxString& lineIdx, const wxString& fileIdx)
{
	m_pattern = pattern;
	m_lineIdx = lineIdx;
	m_fileIdx = fileIdx;
	TransferDataToWindow();
}

void CompilerPatternDlg::OnSubmit( wxCommandEvent& event )
{
	if (TransferDataFromWindow()) {
		if( m_pattern.Trim().IsEmpty() || m_lineIdx.Trim().IsEmpty() || m_fileIdx.Trim().IsEmpty() ) {
			wxMessageBox(_("Please fill all the fields"), _("CodeLite"), wxOK|wxICON_INFORMATION, this);
			return;
		}
		EndModal(wxID_OK);
	}
}

