/////////////////////////////////////////////////////////////////////////////////
//
// This file is part of SACAMOS, cable models for EMI simulations in SPICE.
// It was developed by the University of Nottingham and the Netherlands Aerospace
// Centre (NLR) for ESA under contract number 4000112765/14/NL/HK.
//
// Copyright (C) 2015 - 2018 University of Nottingham
//
// SACAMOS is free software: you can redistribute it and/or modify it under the
// terms of the GNU General Public License as published by the Free Software
// Foundation, either version 3 of the License, or (at your option) any later
// version.
//
// SACAMOS is distributed in the hope that it will be useful, but
// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
// or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
// for more details.
//
// A copy of the GNU General Public License version 3 can be found in the
// file GNU_GPL_v3 in the root or at <http://www.gnu.org/licenses/>.
//
// wxWidgets is currently licenced under the "wxWindows Library Licence".
// A copy of the wxWindows Library Licence, Version 3.1 can be found in the file
// wxWindows_Library_Licence_v3-1 in the root or at:
// <https://www.wxwidgets.org/about/licence/>
//
// The University of Nottingham can be contacted at: ggiemr@nottingham.ac.uk
//
// File Contents:
//
// NAME
//     UTILITIES.cpp
//
// DESCRIPTION
//     Utility Functions:
//
//     check_is_empty           check if input field is left blank
//     check_is numeric:        check if input parameters are numerical values
//     check_is_numeric_list:   check if input is space delimited numerical list
//     check_is_positive:       check if input is >0
//     check_is_greater_than:   check if arguement1 is > than arguement2
//     check_is_less_than:      check if arguement1 is < than arguement2
//     clean_temp_files         clean up run folder
//
// AUTHOR(S)
//     Steve Greedy
//
/////////////////////////////////////////////////////////////////////////////////

#include "UTILITIES.h"

void check_is_empty(wxTextCtrl *TxtBox, int *IsError)
{
    if (TxtBox->GetValue() == "")
    {
        TxtBox->SetBackgroundColour(wxColor(255,153,153));
        TxtBox->SetFocus();
        *IsError = 1;
    }
}

void check_is_numeric(wxTextCtrl *TxtBox, int *IsError)
{

    char* non_numeric = NULL;

    wxString input = TxtBox->GetValue();

    (void) strtod(input, &non_numeric);

    if (*IsError == 0)
    {
        TxtBox->SetBackgroundColour("WHITE");
        TxtBox->Refresh();
    }

    if (*non_numeric || *IsError == 1)
    {
        TxtBox->SetBackgroundColour(wxColor(255,153,153));
        TxtBox->SetFocus();
        *IsError = 1;
    }

}

void check_is_numeric_list(wxTextCtrl *TxtBox, int *IsError)
{

    char* non_numeric = NULL;

    wxString input = TxtBox->GetValue();

    TxtBox->SetBackgroundColour("WHITE");
    TxtBox->Refresh();

    wxStringTokenizer tokenizer(input, " ");

    while ( tokenizer.HasMoreTokens())
    {
        wxString token = tokenizer.GetNextToken();

        (void) strtod(token, &non_numeric);

        if (*non_numeric)
            {
                TxtBox->SetBackgroundColour(wxColor(255,153,153));
                TxtBox->SetFocus();
                *IsError = 1;
            }
    }
}

void check_is_positive (wxTextCtrl *TxtBox, int *IsError)
{
    double value_tb;
    wxString contents_tb;

    contents_tb = TxtBox->GetValue();
    contents_tb.ToDouble(&value_tb);
    if (value_tb < 0 )
    {
        TxtBox->SetBackgroundColour(wxColor(255,153,153));
        TxtBox->SetFocus();
        *IsError = 1;
    }
}

void check_is_less_than (wxTextCtrl *TxtBox1, wxTextCtrl *TxtBox2, int *IsError)
{

    double value_tb1, value_tb2;
    wxString contents_tb1, contents_tb2;

    contents_tb1 = TxtBox1->GetValue();
    contents_tb2 = TxtBox2->GetValue();
    contents_tb1.ToDouble(&value_tb1);
    contents_tb2.ToDouble(&value_tb2);
    if (value_tb1 < value_tb2)
    {
        TxtBox1->SetBackgroundColour(wxColor(255,153,153));
        TxtBox1->SetFocus();
        *IsError = 1;
    }
}

void check_is_greater_than (wxTextCtrl *TxtBox1, wxTextCtrl *TxtBox2, int *IsError)
{

    double value_tb1, value_tb2;
    wxString contents_tb1, contents_tb2;

    contents_tb1 = TxtBox1->GetValue();
    contents_tb2 = TxtBox2->GetValue();
    contents_tb1.ToDouble(&value_tb1);
    contents_tb2.ToDouble(&value_tb2);
    if (value_tb1 > value_tb2)
    {
        TxtBox1->SetBackgroundColour(wxColor(255,153,153));
        TxtBox1->SetFocus();
        *IsError = 1;
    }
}

void check_filename_valid(wxTextCtrl *TxtBox, int *IsError)
{
    wxFileName fname(TxtBox->GetValue());

    TxtBox->SetBackgroundColour("WHITE");
    TxtBox->Refresh();

    if (!fname.IsOk())
    {
        TxtBox->SetBackgroundColour(wxColor(255,153,153));
        TxtBox->SetFocus();
        *IsError = 1;
    }
}

void clean_temp_files()
{
    wxString file, pattern;

    pattern = "*.msh.vtk";

    file = wxFindFirstFile(pattern);
    while ( !file.empty())
    {
        wxRemoveFile(file);
        file = wxFindNextFile();
    }

    pattern = "*.msh";

    file = wxFindFirstFile(pattern);
    while ( !file.empty())
    {
        wxRemoveFile(file);
        file = wxFindNextFile();
    }

    pattern = "*.geo";

    file = wxFindFirstFile(pattern);
    while ( !file.empty())
    {
        wxRemoveFile(file);
        file = wxFindNextFile();
    }

    pattern = "*.dat";

    file = wxFindFirstFile(pattern);
    while ( !file.empty())
    {
        wxRemoveFile(file);
        file = wxFindNextFile();
    }

    pattern = "*.bnd";

    file = wxFindFirstFile(pattern);
    while ( !file.empty())
    {
        wxRemoveFile(file);
        file = wxFindNextFile();
    }

    pattern = "*.pos";

    file = wxFindFirstFile(pattern);
    while ( !file.empty())
    {
        wxRemoveFile(file);
        file = wxFindNextFile();
    }

    pattern = "run_status";

    file = wxFindFirstFile(pattern);
    while ( !file.empty())
    {
        wxRemoveFile(file);
        file = wxFindNextFile();
    }
}



