#pragma once
#include "base_head.h"
#include "cartoBaseDef.h"
#include "garray.h"
#ifndef CartoBaseElements_H
#define CartoBaseElements_H
class CartoEntity;
//clases internas de cartobase----------------------------------------------
class UTILES_EXPORT CartoBaseEntity
{
public:
	int 	id;			//indice a objeto
	int		type;		//tipo de entidad
	int		idPaintp;	//inide a propiedades
	int		flagsUser;	//flags para uso de usuario
	int		flagsInt;	//flags para uso interno
	int		ref;		//referencia unica por elemento

	//tamaņo---------
	int mima[2];		//indice a punto maximo y minimo (el elemento esta contenido entre dichos puntos)
	int		ia;			//indice a informacion adicional

	CartoBaseEntity()
	{
		id = -1;
		idPaintp = -1;
		flagsInt = 0;
	}
};
//entidad interna de putno
class UTILES_EXPORT CartoBasePoint
{
public:
	double pts[3];//coordenadas del punto

	CartoBasePoint(){
		pts[0]=pts[1]=pts[2]=0;
	}
};

//entidad interna de linea
class UTILES_EXPORT CartoBaseLine
{
public:
	int ini;	//inidce a punto inicio
	int n;		//numero de puntos del lineal
	CartoBaseLine()
	{
		n = 0;
		ini = -1;
	}
};
//entidad interna de propiedades de pintado
class UTILES_EXPORT CartoBasePaintedProps
{
public:
	int		color;		//indice a color
	int		peso;		//grosor o tamaņo de letra (segun entidad)
	int		prioridad;	//prioridad de pintado
	int		flags;		//flags internos 0x1 (visto para los clear)
	CartoBasePaintedProps()
	{
		color = -1;
		peso = 1;
		flags = 0;
	}
};
//entidad interna de color
class UTILES_EXPORT CartoBaseColor
{
public:

	int color;
	int		flags;		//flags internos 0x1 (visto para los clear)
	CartoBaseColor()
	{
		color = 0;
		flags = 0;
	}
};

//entidad base de informacion
class CartoBase;
class UTILES_EXPORT CartoBaseInfoEntity: public SetPtsR
{
public:
	//funciones externas
	CartoBasePoint* (*fpto)(CartoBaseInfoEntity *c);
	CartoBaseLine* (*fline)(CartoBaseInfoEntity *c);
	int i_entity;

	CartoBase* ptr;

	CartoBaseInfoEntity();

	virtual bool isValid();					//dice si es valido o no la entidad de informacion
	virtual CartoBaseInfoEntity next();		//devuelve entidad siguiente
	virtual CartoBaseInfoEntity prev();		//devuelve entidad anterior

	//acceso a informacion interna
	virtual CartoBasePoint* pto();
	virtual CartoBaseEntity* entity();
	virtual CartoBaseLine* line();
	virtual CartoBasePaintedProps* paintp();
	virtual CartoBaseColor* color();
	virtual CartoEntity* getCopy(CartoEntity *buf=NULL);
	//funciones SetPts--------------------------
	virtual double* getPto(int i);
	virtual int getNumberPtos();

	void* getIa();
	double getLong();
	double disMedLines(SetPtsR *line2, double l_avan, double *desv=NULL);
	double disMedLines(SetPtsR *line2, double *desv=NULL);
	double DisPtoLine(double*p, int* idpto=NULL, double *lamb=NULL);
	SetPtsW *GetNPrimePtos(SetPtsW *ldst, int nptos, double dis, BOOL avanza);
	bool DivLine(SetPtsW* ldst1, SetPtsW* ldst2,  int ip, double lamb);
	double *GetPtoDis(double dis, double *dst, double *distTot);
	double *PtInLine(int ip, double lamb, double *pp);
	double DplineSeg(double* s1, double *s2,int *n=NULL, double *lamd1=NULL,double *lamb2=NULL);
};
//calse coleccion de entidades
class UTILES_EXPORT SetEntities
{
public:
	virtual CartoBaseInfoEntity getEntity(int i)=0;
	virtual int getNumberEntities()=0;
};

//clase de filtrado de entidades
class UTILES_EXPORT FilterEntities
{
public:
	virtual bool IsSeletedEntity(CartoBaseInfoEntity *e)=0;
};

//array de entidades
class UTILES_EXPORT EntitiesArray: public Cgarray<CartoBaseInfoEntity>, public SetEntities, public SetPtsR
{
public:
	virtual CartoBaseInfoEntity getEntity(int i);
	virtual int getNumberEntities();

	virtual double* getPto(int i);
	virtual int getNumberPtos();

	EntitiesArray* filter(EntitiesArray* dst, FilterEntities* filter);
	bool exportShp(char* path, int type = CartoBaseTypes::Ndef);
};
//entidad de informacion punto
class UTILES_EXPORT CartoBaseInfoPto
{
public:
	static CartoBasePoint* pto(CartoBaseInfoEntity*c);
};
//entidad de informacion linea
class UTILES_EXPORT CartoBaseInfoLine
{
public:

	static CartoBasePoint* pto(CartoBaseInfoEntity*c);
	static CartoBaseLine* line(CartoBaseInfoEntity*c);
};

//clase constructor de entidades info
class UTILES_EXPORT CartoBaseInfoBuilder
{
public:
	static CartoBaseInfoEntity get(int i, CartoBase* ptr);
	static CartoEntity* get(int type);
};
#endif
