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

using namespace std;
using namespace uCalcSoftware;

int main() {
   uCalc uc;
   auto FruitsXML =
   R"(
<Fruits>
  <Fruit CommonName='Apple' ScientificName='Malus domestica' />
  <Fruit CommonName='Banana' ScientificName='Musa acuminata' />
  <Fruit CommonName='Orange' ScientificName='Citrus × sinensis' />
  <Fruit CommonName='Grapes' ScientificName='Vitis vinifera' />
  <Fruit CommonName='Strawberry' ScientificName='Fragaria × ananassa' />
  <Fruit CommonName='Pineapple' ScientificName='Ananas comosus' />
  <Fruit CommonName='Mango' ScientificName='Mangifera indica' />
  <Fruit CommonName='Blueberry' ScientificName='Vaccinium corymbosum' />
  <Fruit CommonName='Rambutan' ScientificName='Nephelium lappaceum' />
  <Fruit CommonName='Salak (Snake Fruit)' ScientificName='Salacca zalacca' />
  <Fruit CommonName='Jabuticaba' ScientificName='Plinia cauliflora' />
  <Fruit CommonName='Watermelon' ScientificName='Citrullus lanatus' />
</Fruits>
)";

   auto t = uc.NewTransformer();
   t.Text(FruitsXML);

   auto Pass1 = t.Pass();
   auto Pass2 = t.Pass();

   Pass1.Description("Pass A");
   Pass1.FromTo("Fruits", "ListOfFruits");
   Pass1.FromTo("<Fruit CommonName={@str:name} ScientificName={@str:sci_name} />", "<Fruit>{name}</Fruit>");

   Pass2.Description("Pass B");
   Pass2.FromTo("{Fruit: Apple | Orange | Mango }", "{Fruit} *");
   Pass2.FromTo("{Fruit: Banana | Grapes | Watermelon }", "{Fruit} **");

   t.Transform();
   cout << "All passes" << endl;
   cout << "----------" << endl;
   cout << t.Text() << endl;

   cout << t.Pass(0).Description() << endl;
   cout << t.Pass(1).Description() << endl;
   cout << "Pass count: " << t.PassCount() << endl;
   cout << "" << endl;

   t.Str(FruitsXML);
   Pass2.Release();
   t.Transform();
   cout << "Pass1 only (Pass2 released)" << endl;
   cout << "---------------------------" << endl;
   cout << t.Text() << endl;

}