#pragma once
#ifndef CartoBase_h
#define CartoBase_h

#include "base_head.h"
#include "CartoBaseDef.h"
#include "CartoBaseElements.h"
#include "CartoElements.h"
#include "IaDataTable.h"
#include <map>
/*
hacer el memoryclear
guardar dbf ia
*/
class Cb_file;
class UTILES_EXPORT CartoBase: public SetEntities, public SetPtsR, public DataIaCartoBase
{
	//clases amigo-----------------
	 friend class CartoBaseInfoEntity;
	 friend class CartoBaseInfoPto;
	 friend class CartoBaseInfoLine;
	 friend class CartoBaseInfoBuilder;
	 friend class CartoPto;
	 friend class CartoLine;
private:
	//info interna-------------------------------
	int ref;//referencia para el siguiente elemento
	CartoBasePaintedProps _defaultpaintedProps;
	CartoBaseColor		_defaultColor;
	//array de informacion de entidades
	Cgarray<CartoBaseEntity> _entities;//entidades
	Cgarray<CartoBasePoint> _points;//coordenadas
	Cgarray<CartoBaseLine> _lines;//lineas
	Cgarray<CartoBasePaintedProps> _paintedProps;//propiedades de pintado
	Cgarray<CartoBaseColor> _colors;
	std::map<int, int> refIndex;//indexado por referencias;
	//datos de ia-----------------------------------------
	char iaName[12];//nombre columna ia tipo IntIa
	int typeIA;//indica el tipo de informacion asociada que se utilizara
public:

	IaDataTable dataIa;
	DataIaCartoBase *iaEx;
	enum TypedataIa
	{
		NIa=0,//sin informacion asociada
		IntIa,//usa solo un entero por entidad como ia con nombre de columna iaName
		DtIa,//usa la dataIa para almacenar info asociada
		ExIa//informacion asociada externa
	};

	CartoBase(void);
	~CartoBase(void);
	
	//funciones-----------------------------------------------------------------
	CartoBaseInfoEntity get(int i);//acceso a entidad iesima (modo lectura)
	CartoBaseInfoEntity getRef(int r);//acceso a entidad con referencia r (modo lectura)

	
	//aņade elementos
	bool add(CartoEntity& element);
	bool add(CartoBase& cad);

	bool remove(int i);//pone marca de flag de borrado (pero sigue siendo accesible)
	bool removeRef(int r);

	bool FastClear();//solo borra entidades y rehace las referencias
	bool clear();//limpia elementos borrados y ajusta memoria
	bool MemClear();//limpia memoria de todos los arrays

	EntitiesArray* filter(EntitiesArray* dst, FilterEntities *filter);

	virtual bool leer(char *path);
	virtual bool grabar(char *path);
	virtual  bool leer(Cb_file *f);
	virtual  bool grabar(Cb_file *f);
	
	int addDefaultPaintedProps();//crea unas propiedades de pintado como las por defecto

	bool importShp(char* path);//importa shp
	bool exportShp(char* path);//exporta a shp (todos los tipos que cuinciden con la primera)
	bool ptosExportShp(char* path);
	bool linesExportShp(char* path);

	void del();//limpia toda la carto (sin liberar memoria)
	
	//funciones de ia-------------------------------------------------------------------
	void* getIa(int refEnt);//devuelve informacion asociada externa de la entidad refEnt
	int getTypeIA(){return typeIA;}//devuelve el tipo de ia que tiene actualmente
	void setExIa(DataIaCartoBase* ia);//setea un ia externo
	int getEntityRef(int ientity);//devuelve la referencia
	void setNameIa(char *name);//pone el nombre de la col
	
	//funciones por ser SetEntities
	virtual CartoBaseInfoEntity getEntity(int i);
	virtual int getNumberEntities();
	//funciones por ser SetPts
	virtual double* getPto(int i);
	virtual int getNumberPtos();
	//funciones auxiliares------------
	int getNexRef(){return ref;};

	//funciones DataIaCartoBase
	virtual bool IaGetSize( int *ncolm );
	virtual bool IaGetColm( int icol, char* name, BYTE *type, int *size, int*ndecimal );
	virtual bool IaGetVal( int refEnt, int icol, int* v );
	virtual bool IaFinW(){return true;}

private:
	
	int add(CartoBaseEntity* src);
	int add(CartoBasePoint* src);
	int add(CartoBaseLine* src);
	int add(CartoBasePaintedProps* src);
	int add(CartoBaseColor* src);

	bool fexportShp(char* path, int type = CartoBaseTypes::Ndef);

	void indexRef(bool buscaRepes=false);//indexa referencias
	void iniIndexRef();//crea indexado
	void reIndexRef();
};

class FiterCartoBase: public SetEntities
{
public:
	CartoBase* cb;
	Cgarray<int> ind;

	virtual CartoBaseInfoEntity getEntity( int i );

	virtual int getNumberEntities();
};
#endif