/***************************************************************************
 *   Copyright (C) 2021 by Santiago González                               *
 *                                                                         *
 ***( see copyright.txt file at root folder )*******************************/

#pragma once

#include <QString>
#include <QProcess>

#include "compbase.h"

class OutPanelText; 
class CodeEditor; 

class Compiler : public QObject, public CompBase
{
    Q_OBJECT

    public:
        Compiler( CodeEditor* editor, OutPanelText* outPane ); 
        ~Compiler(); 

        QString compName() { return m_compName;  }
        void setCompName( QString ) {; }

        virtual QString toolPath() { return m_toolPath;  }
        virtual void setToolPath( QString path ); 

        QString includePath() { return m_inclPath;  }
        void setIncludePath( QString path ); 

        QString extraArgs() { return m_extraArgs;  }
        void setextraArgs( QString s ) { m_extraArgs = s;  }

        QString family() { return m_family;  }
        void setFamily( QString f ) { m_family = f;  }

        QString device() { return m_device;  }
        void setDevice( QString d ) { m_device = d;  }

        QString fileName() { return m_fileName;  }
        QString buildPath() { return m_buildPath;  }
        QString file() { return m_file ;  }

        void clearCompiler(); 
        void loadCompiler( QString file ); 
        virtual int compile( bool debug ); 

        virtual void compilerProps(); 

        bool isProjectFile( QString file ) { return m_fileList.contains( file );  }

        void readSettings(); 

        bool checkCommand( QString c ); 

        OutPanelText* outPane() { return m_outPane;  }

    protected:
        void addFilePropHead(); 

        virtual void preProcess(){; }
        virtual bool postProcess(){return false; }

        int getErrors(); 
        virtual int getErrorLine( QString txt ); 
        int getFirstNumber( QString txt ); 
        void compiled( QString firmware ); 

        int runBuildStep( QString fullCommand ); 
        QString replaceData( QString str ); 
        void toolChainNotFound(); 

        CodeEditor* m_editor; 

        bool m_uploadHex; 
        bool m_fileProps; 

        QString m_compName; 
        QString m_toolPath; 
        QString m_inclPath; 
        QString m_buildPath; 
        QString m_extraArgs; 
        QStringList m_command; 
        QStringList m_arguments; 
        QStringList m_argsDebug; 
        QStringList m_fileList; 

        QString m_compilerType; 
        QString m_family; 
        QString m_device; 
        QString m_firmware; 
        QString m_file; 
        QString m_fileDir; 
        QString m_fileName; 
        QString m_fileExt; 

        QProcess m_compProcess; 

        OutPanelText* m_outPane; 
}; 
