begin;
CREATE OR REPLACE FUNCTION script.geom_fincas_ed() RETURNS trigger AS $$
/*
Autor: Gaspar Mora Navarro. Universidad Politécnica de Valencia.
Este disparador realiza las comprobaciones necesarias para que todos los
polígonos insertados en la capa src_XXXXX.fincas sean correctos.
Se ejecuta antes de INSERT o UPDATE: en las tablas ed_fincas y fincas
Realiza las siguientes comprobaciones:
	- Que la geometría no sea null
	- Que la geometría no sea empty
	- Que la geometría sea simple, es decir que no tenga auto intersecciones
	- Que el area no sea menor que area_min
	- Que el perimetro no sea menor que long_min
	- Que no se superpone con otros polígonos y la superposición tiene un area mayor de area_err
	- Que el polígono a insertar no se superpone con ningún otro. En tal caso rechaza la insercion y dibuja el solape en la capa ed_srcXXXX.ed_overlaps_fincas. Luego, se genera una excepcion y se aborta la transaccion, con lo que los poligonos interseccion sobre la capa nom_tabla_overlaps se borran. Si se necesita su dibujo, hay que llamar a la funcion script.comprueba_overlaps en otra transaccion que no genere un error.
	- Que el poligono a insertar no tiene partes sin tocar a otras fincas de la tabla srcXXXXX.fincas. En tal caso se dibujan dichas partes sobre la capa ed_srcXXXX.ed_gaps_fincas o srcXXXXX.gaps_fincas, segun sea la tabla que provoca el la ejecucion del trigger ed_fincas o fincas, respectivamente.
	- Que Si no hay ningun poligono a menos distancia de distancia_gap, se considera un poligono aislado y no se marca como error gap.

Para saber el area, perimetro, longitud y distancia_gap minimas aceptadas hace una consulta
a la tabla dom.cfg_tamanos

IMPORTANTE: Se resalta que las comprobaciones se realizan siempre con la capa definitiva fincas. La insercion de fincas en la capa de edicion es libre, no se hacen comprobaciones. Antes de insertar en ed_fincas se comprueba que no hay solapes ni gaps con la capa fincas. Si hay problemas se dibujan los errores en las capas ed_gaps_fincas y ed_overlaps_fincas.

Utiliza las funciones:
	- script.comprueba_geom
	- script.comprueba_tama
	- script.comprueba_overlaps
	- script.comprueba_gaps
*/
DECLARE
	geom geometry;
	taman boolean;
	area_m double precision;
	peri_m double precision;
	dis_gap double precision;

	nom_tabla_overlaps varchar;--nombre de la tabla overlaps
	nom_tabla_gaps varchar;--nombre de la tabla espacial de los gaps
	cons_del_old_overlaps varchar;--consulta para borrar los antiguos overlaps del trabajo
	cons_del_old_gaps varchar;--consulta para borrar los antiguos gaps del trabajo
	nom_tabla_fincas_def varchar;--tabla sobre la que se comprueba que no haya huecos o solapes
	area double precision;
	area_e double precision;
	resp boolean;
BEGIN
	--si no se cambian las geometrias no se hace nada.
	if TG_OP='UPDATE' then
		if ST_Equals(NEW.geom,OLD.geom) then
			return NEW;
		end if;
	end if;
	
	NEW.geom:=script.comprueba_geom(NEW.geom);
	select area_min, perim_min, distancia_gap, area_err into area_m, peri_m, dis_gap, area_e from dom.cfg_tamanos where id >-1;

	if not found then
		raise exception 'Error en geom_fincas: La consulta select area_min, perim_min into area_m, peri_m from dom.cfg_tamanos where id=1 no produjo ningun resultado';
	end if;

	taman:=script.comprueba_tama(NEW.geom,area_m,peri_m);--genera un exception si hay problemas

	if TG_TABLE_NAME='ed_fincas' then
		nom_tabla_overlaps:=TG_TABLE_SCHEMA || '.ed_overlaps_fincas';
		nom_tabla_gaps:=TG_TABLE_SCHEMA || '.ed_gaps_fincas';
	else
		raise exception 'Este disparador solo se puede usar con la tabla ed_fincas';
	end if;
	
	nom_tabla_fincas_def:=substring(TG_TABLE_SCHEMA,4) || '.fincas';

	cons_del_old_overlaps:='delete from ' || nom_tabla_overlaps || ' where id_trabajo = $1';
	execute cons_del_old_overlaps using new.id_trabajo;

	area:=script.comprueba_overlaps(NEW.geom, nom_tabla_fincas_def, nom_tabla_overlaps, 'id_trabajo', new.id_trabajo,-1);
	-- si hay superposiciones,
	-- de la geometria con las geometrias de nom_tabla_fincas_def
	-- se dibujan los poligonos interseccion sobre la capa nom_tabla_overlaps
	-- y devuelve true. Si no hay devuelve false.
	-- Si devuelve true, en las lineas de abajo se genera una excepcion
	-- y se aborta todo, con lo que los poligonos interseccion sobre la capa
	-- nom_tabla_overlaps se borran.
	

	if area > area_e then
		raise exception 'Error de superposicion. La finca se superpone con alguna otra finca. 
Compruebe la capa %. Area superpuesta %',nom_tabla_overlaps,area;
		return null;
	end if;

	cons_del_old_gaps:='delete from ' || nom_tabla_gaps || ' where id_trabajo = $1';


	--raise notice 'cons_del_old_overlaps: %',cons_del_old_overlaps;
	--raise notice 'cons_del_old_gaps: %',cons_del_old_gaps;
	--borro los antiguos errores del trabajo, si los había.

	execute cons_del_old_gaps using new.id_trabajo;


	resp=script.comprueba_gaps(NEW.geom, nom_tabla_fincas_def, nom_tabla_gaps, dis_gap,'id_trabajo', new.id_trabajo,-1);--si hay porciones de perímetro,
				--de la geometria sin estar pegados a los poligonos de nom_tabla_fincas_def
				--se dibujan los arcos erroneos sobre la capa nom_tabla_gaps
				--y devuelve true, pero el registro se puede insertar, ya que no se sabe
				--si es error o no.

	if resp=true then
		raise warning 'La finca tiene partes sin tocar otro poligono. 
Puede haber errores gaps. Compruebe la capa %',nom_tabla_gaps;
	end if;

	return NEW;
  END;
$$ LANGUAGE 'plpgsql';

commit;
