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

using namespace std;
using namespace uCalcSoftware;

int main() {
   uCalc uc;
   auto t = uc.NewTransformer();
   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 Fruit = t.FromTo("CommonName={@string:name}", "{name}");

   // StopAfter()
   Fruit.StopAfter(4);
   t.Filter(FruitsXML);
   cout << "*** Stop after: " << Fruit.StopAfter() << " ***" << endl;
   cout << t.Matches().Text() << endl;
   Fruit.StopAfter(-1); // Resets back to infinity (default) for next example
   cout << "" << endl;

   // StartAfter()
   Fruit.StartAfter(6);
   t.Filter(FruitsXML);
   cout << "*** Start after: " << Fruit.StartAfter() << " ***" << endl;
   cout << t.Matches().Text() << endl;
   Fruit.StartAfter(0); // Resets back to 0 (default) for next example
   cout << "" << endl;


   // Both StartAfter() and StopAfter()
   Fruit.SetStartAfter(2).SetStopAfter(5);
   t.Filter(FruitsXML);
   cout << "*** Between " << Fruit.StartAfter() + 1 << " and " << Fruit.StopAfter() << " ***" << endl;
   cout << t.Matches().Text() << endl;
   cout << "" << endl;

   // All
   uc.DefineVariable("x = 1");
   Fruit = t.FromTo("CommonName={@string:name}", "{@Eval: x++}. {name}");
   t.Filter(FruitsXML);
   cout << "*** All ***" << endl;
   cout << t.Matches().Text() << endl;
}