#include <iostream>
#include "uCalc.h"

using namespace std;
using namespace uCalcSoftware;

int main() {
   uCalc uc;
   // Define a variable in the original default to distinguish it.
   // Note: This variable won't exist in the implicit 'uc' instance.
   uCalc::DefaultInstance().DefineVariable("id='Original'");
   cout << "Initial default: " << uCalc::DefaultInstance().EvalStr("id") << endl;

   uCalc ucA;
   ucA.DefineVariable("id='A'");
   ucA.IsDefault(true); // Default stack: [Original, A]
   cout << "Current default: " << uCalc::DefaultInstance().EvalStr("id") << endl;

   uCalc ucB;
   ucB.DefineVariable("id='B'");
   ucB.IsDefault(true); // Default stack: [Original, A, B]
   cout << "Current default: " << uCalc::DefaultInstance().EvalStr("id") << endl;

   uCalc ucC;
   ucC.DefineVariable("id='C'");
   ucC.IsDefault(true); // Default stack: [Original, A, B, C]
   cout << "Current default: " << uCalc::DefaultInstance().EvalStr("id") << endl;

   cout << "--- Unsetting instances ---" << endl;
   // Unset B. The default should remain C.
   ucB.IsDefault(false);
   cout << "After unsetting B, current default: " << uCalc::DefaultInstance().EvalStr("id") << endl;

   // Unset C. The default should revert to A.
   ucC.IsDefault(false);
   cout << "After unsetting C, current default: " << uCalc::DefaultInstance().EvalStr("id") << endl;

   // Unset A. Reverts to the original default.
   ucA.IsDefault(false);
   cout << "After unsetting A, current default: " << uCalc::DefaultInstance().EvalStr("id") << endl;
}