// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
// Copyright (C) 2010  Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.

#include "attribute.h"
#include "node.h"
#include "brain.h"
#include "tree.h"
#include "value.h"
#include "cond_node.h"
#include "result_node.h"

#include <iostream>
#include <valarray>
#include <math.h>

void test1()
{
	CBrain				brain(10,10,10,10,10);
	CTree				tree;

	CBoolField				viande("Viande");
	CBoolField				grand("Grand");
	CBoolField				bon("Bon");
	std::vector<std::string> vals_couleur;
	vals_couleur.push_back(std::string("Vert"));
	vals_couleur.push_back(std::string("Rouge"));
	CStringField			couleur(std::string("Couleur"), vals_couleur);

	brain.addField(&viande);
	brain.addField(&grand);
	brain.addField(&bon);
	brain.addField( (CField *) &couleur);

	tree.setKey(2);
	brain.addTree( &tree );

	CValue<bool>	val1(true);
	CValue<bool>	val2(false);
	CValue<std::string>	val3("Vert");
	CValue<std::string>	val4("Rouge");
	CValue<std::string>	val5("Orange");

	CRecord			r1;
	r1.addValue( &val1);
	r1.addValue( &val1);
	r1.addValue( &val1 );
	r1.addValue( &val4 );

	CRecord			r2;
	r2.addValue( &val2);
	r2.addValue( &val2);
	r2.addValue( &val2 );
	r2.addValue( &val4 );

	CRecord			r3;
	r3.addValue( &val1 );
	r3.addValue( &val1 );
	r3.addValue( &val1 );
	r3.addValue( &val3 );

	CRecord			r4;
	r4.addValue( &val2);
	r4.addValue( &val2);
	r4.addValue( &val2);
	r4.addValue( &val5);

	CRecord			r5;
	r5.addValue( &val2 );
	r5.addValue( &val2 );
	r5.addValue( &val2 );
	r5.addValue( &val3);

	CRecord			r6;
	r6.addValue( &val2 );
	r6.addValue( &val1 );
	r6.addValue( &val2 );
	r6.addValue( &val4 );

	CRecord			r7;
	r7.addValue( &val1 );
	r7.addValue( &val2 );
	r7.addValue( &val2 );
	r7.addValue( &val3 );

	CRecord			r8;
	r8.addValue( &val1 );
	r8.addValue( &val1 );
	r8.addValue( &val1 );
	r8.addValue( &val3 );

	CRecord			r9;
	r9.addValue( &val1 );
	r9.addValue( &val1 );
	r9.addValue( &val1 );
	r9.addValue( &val3 );

	CRecord			r10;
	r10.addValue( &val2 );
	r10.addValue( &val1 );
	r10.addValue( &val2 );
	r10.addValue( &val4 );

	brain.setInput(&r1);
	brain.setInput(&r2);
	brain.setInput(&r3);
	brain.setInput(&r4);
	brain.setInput(&r5);
	brain.setInput(&r6);
	brain.setInput(&r7);
	brain.setInput(&r8);
	brain.setInput(&r9);
	brain.setInput(&r10);

	brain.build();
	std::cout << brain.getDebugString();

	brain.setInput(&r7);
}	


void test2()
{
	std::string age_old("old");
	std::string age_mid("mid");
	std::string age_new("new");

	std::vector<std::string> vals_age;
	vals_age.push_back( age_old );
	vals_age.push_back( age_mid );
	vals_age.push_back( age_new );
	CStringField			age(std::string("AGE"), vals_age);

	CValue<bool> val_true(true);
	CValue<bool> val_false(false);


	CBoolField competition(std::string("Competition"));

	std::string type_swr("swr");
	std::string type_hwr("hwr");

	std::vector<std::string> vals_type;
	vals_type.push_back( type_swr );
	vals_type.push_back( type_hwr );
	CStringField			type(std::string("TYPE"), vals_type);

	CBoolField	profit("Profit");

	CBrain				brain(10,10,10,10,10);
	CTree				tree;

	brain.addField( &age );
	brain.addField( &competition );
	brain.addField( &type );
	brain.addField( &profit );

	tree.setKey( 3 );
	brain.addTree( &tree );

	CRecord r1;
	r1.addValue( age_old );
	r1.addValue( &val_true );
	r1.addValue( type_swr );
	r1.addValue( &val_false );
	brain.addRecord( &r1 );

	CRecord r2;
	r2.addValue( age_old );
	r2.addValue( &val_false );
	r2.addValue( type_swr );
	r2.addValue( &val_false );
	brain.addRecord( &r2 );

	CRecord r3;
	r3.addValue( age_old );
	r3.addValue( &val_false );
	r3.addValue( type_hwr );
	r3.addValue( &val_false );
	brain.addRecord( &r3 );

	CRecord r4;
	r4.addValue( age_mid );
	r4.addValue( &val_true );
	r4.addValue( type_swr );
	r4.addValue( &val_false );
	brain.addRecord( &r4 );

	CRecord r5;
	r5.addValue( age_mid );
	r5.addValue( &val_true );
	r5.addValue( type_hwr );
	r5.addValue( &val_false );
	brain.addRecord( &r5 );

	CRecord r6;
	r6.addValue( age_mid );
	r6.addValue( &val_false );
	r6.addValue( type_hwr );
	r6.addValue( &val_true );
	brain.addRecord( &r6 );

	CRecord r7;
	r7.addValue( age_mid );
	r7.addValue( &val_false );
	r7.addValue( type_swr );
	r7.addValue( &val_true );
	brain.addRecord( &r7 );

	CRecord r8;
	r8.addValue( age_new );
	r8.addValue( &val_true );
	r8.addValue( type_swr );
	r8.addValue( &val_true );
	brain.addRecord( &r8 );

	CRecord r9;
	r9.addValue( age_new );
	r9.addValue( &val_false );
	r9.addValue( type_hwr );
	r9.addValue( &val_true );
	brain.addRecord( &r9 );

	CRecord r10;
	r10.addValue( age_new );
	r10.addValue( &val_false );
	r10.addValue( type_swr );
	r10.addValue( &val_true );
	brain.addRecord( &r10 );

	brain.build();
	brain.setInput( &r5 );
}

int main(int, char *[])
{
	test2();
}