// *****************************************************************************
// Notices:
// 
// Copyright � 2019 United States Government as represented by the Administrator
// of the National Aeronautics and Space Administration.  All Rights Reserved.
// 
// Disclaimers
// 
// No Warranty: THE SUBJECT SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY OF
// ANY KIND, EITHER EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, BUT NOT LIMITED
// TO, ANY WARRANTY THAT THE SUBJECT SOFTWARE WILL CONFORM TO SPECIFICATIONS, 
// ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, 
// OR FREEDOM FROM INFRINGEMENT, ANY WARRANTY THAT THE SUBJECT SOFTWARE WILL BE
// ERROR FREE, OR ANY WARRANTY THAT DOCUMENTATION, IF PROVIDED, WILL CONFORM TO
// THE SUBJECT SOFTWARE. THIS AGREEMENT DOES NOT, IN ANY MANNER, CONSTITUTE AN
// ENDORSEMENT BY GOVERNMENT AGENCY OR ANY PRIOR RECIPIENT OF ANY RESULTS,
// RESULTING DESIGNS, HARDWARE, SOFTWARE PRODUCTS OR ANY OTHER APPLICATIONS
// RESULTING FROM USE OF THE SUBJECT SOFTWARE.  FURTHER, GOVERNMENT AGENCY
// DISCLAIMS ALL WARRANTIES AND LIABILITIES REGARDING THIRD-PARTY SOFTWARE, IF
// PRESENT IN THE ORIGINAL SOFTWARE, AND DISTRIBUTES IT ''AS IS.''
// 
// Waiver and Indemnity:  RECIPIENT AGREES TO WAIVE ANY AND ALL CLAIMS AGAINST
// THE UNITED STATES GOVERNMENT, ITS CONTRACTORS AND SUBCONTRACTORS, AS WELL AS
// ANY PRIOR RECIPIENT.  IF RECIPIENT'S USE OF THE SUBJECT SOFTWARE RESULTS IN
// ANY LIABILITIES, DEMANDS, DAMAGES, EXPENSES OR LOSSES ARISING FROM SUCH USE,
// INCLUDING ANY DAMAGES FROM PRODUCTS BASED ON, OR RESULTING FROM, RECIPIENT'S
// USE OF THE SUBJECT SOFTWARE, RECIPIENT SHALL INDEMNIFY AND HOLD HARMLESS THE
// UNITED STATES GOVERNMENT, ITS CONTRACTORS AND SUBCONTRACTORS, AS WELL AS ANY
// PRIOR RECIPIENT, TO THE EXTENT PERMITTED BY LAW.  RECIPIENT'S SOLE REMEDY FOR
// ANY SUCH MATTER SHALL BE THE IMMEDIATE, UNILATERAL TERMINATION OF THIS
// AGREEMENT.
// *****************************************************************************
const EFormulaStates = require("./EFormulaStates");

module.exports = class Formula {

    constructor(id, expression, traceLength) {
        this.id = id;
        this.label = id;
        this.subexpressions = [];
        this.atomics = [];
        this.trace = new Array(traceLength).fill(0);
        this.value = EFormulaStates.UNKNOWN;
        this.tex = "";
        this.parsedExpression = "";
        this.parseErrors = [];
        this.expression = expression;
    }

    static render(expression) {
        return expression
                    .replace(/_/g, "\\_")
                    .replace(/&/g, "\\wedge ")
                    .replace(/\|/g, "\\vee ")
                    .replace(/\bxor\b/g, "\\veebar ")
                    .replace(/->/g, "\\rightarrow ")
                    .replace(/<->/g, "\\leftrightarrow ")
                    .replace(/!/g, "\\neg ")
                    .replace(/\bF\b/g, "\\mathcal{F} ")
                    .replace(/\bG\b/g, "\\mathcal{G} ")
                    .replace(/\bH\b/g, "\\mathcal{H} ")
                    .replace(/\bO\b/g, "\\mathcal{O} ")
                    .replace(/\bS\b/g, "\\mathcal{S} ")
                    .replace(/\bT\b/g, "\\mathcal{T} ")
                    .replace(/\bU\b/g, "\\mathcal{U} ")
                    .replace(/\bV\b/g, "\\mathcal{V} ")
                    .replace(/\bX\b/g, "\\mathcal{X} ")
                    .replace(/\bY\b/g, "\\mathcal{Y} ")
                    .replace(/\bZ\b/g, "\\mathcal{Z} ")
                    .replace(/\bTRUE\b/g, "\\top ")
                    .replace(/\bFALSE\b/g, "\\bot ")
                    .replace(/\[/g, "_{[")
                    .replace(/\]/g, "]}")
                    .replace(/\(/g, "\\left(")
                    .replace(/\)/g, "\\right)");
    }
};
