-- Copyright 2010, Intevation GmbH, Germany, <info@intevation.de>
--
-- This file is part of FGSK.
--
-- FGSK is free software: you can redistribute it and/or modify it under
-- the terms of the GNU General Public License as published by the
-- Free Software Foundation, either version 2 of the License, or (at your
-- option) any later version.
--
-- FGSK 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 General Public
-- License for more details.
--
-- You should have received a copy of the GNU General Public
-- License along with FGSK. If not, see <http://www.gnu.org/licenses/>.
--
-- FGSK has been developed on behalf of the
-- Landesamt fuer Umwelt und Geologie Mecklenburg Vorpommern (LUNG-MV)
-- by Intevation GmbH. 
-- biota Institut fuer oekologische Forschung und Planung GmbH has provided
-- the functional background.
--
-- Authors:
-- Tim Englich <tim.englich@intevation.de>
-- Ingo Weinzierl <ingo.weinzierl@intevation.de>

BEGIN;
CREATE OR REPLACE FUNCTION 
         recalculate_total_points_kartierabschnitt_func(kartierabsch_id INTEGER)
RETURNS INTEGER AS
$$
DECLARE
BEGIN
    --
    -- Temporal update so it is easier to see if 
    -- the recalculation take affect.
    --
    UPDATE kartierabschnitt SET punktzahl_gesamt = NULL,
                                punktzahl_sohle = NULL,
                                punktzahl_ufer = NULL,
                                punktzahl_land = NULL
           WHERE id = kartierabsch_id;

    --
    -- SET rating for laufentwicklung to null to avoid to
    -- many calculations of the total-rating.
    --
    UPDATE laufentwicklung set summe_punktzahl = NULL
           WHERE kartierabschnitt_id = kartierabsch_id;

    RAISE DEBUG '########## START GESAMTAUSWERTUNG ##########';
    RAISE DEBUG 'Kartierabschnitt ID %', kartierabsch_id;

    PERFORM calculate_points_gewaesserumfeld_func(kartierabsch_id);
    PERFORM calculate_points_uferstruktur_func(kartierabsch_id);
    PERFORM calculate_points_sohlenstruktur_func(kartierabsch_id);
    PERFORM calculate_points_querprofil_func(kartierabsch_id);
    PERFORM calculate_points_laengsprofil_func(kartierabsch_id);
    PERFORM calculate_points_laufentwicklung_func(kartierabsch_id);

    RAISE DEBUG '########## ENDE GESAMTAUSWERTUNG ##########';

    RETURN kartierabsch_id;
END;
$$ LANGUAGE plpgsql;

--
-- Remove bewertungen
--
CREATE OR REPLACE FUNCTION 
         delete_bewertung_func(kartierabsch_id INTEGER)
RETURNS INTEGER AS
$$
DECLARE
BEGIN
    UPDATE kartierabschnitt SET punktzahl_gesamt = NULL,
                                punktzahl_sohle = NULL,
                                punktzahl_ufer = NULL,
                                punktzahl_land = NULL
           WHERE id = kartierabsch_id;

    --

    RETURN kartierabsch_id;
END;
$$ LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION update_gewaessertyp_kartierabschnitt_func()
RETURNS TRIGGER AS
$$
DECLARE
BEGIN
    IF (TG_OP = 'UPDATE') THEN
        IF (TG_TABLE_NAME = 'kartierabschnitt') THEN
            RAISE DEBUG '%: TABLE NAME = %', TG_OP, TG_TABLE_NAME;
            IF (NEW.gewaessertyp_id IS NOT NULL AND
                NEW.gewaessertyp_id != OLD.gewaessertyp_id) THEN
                RAISE DEBUG 'Gewaessertyp hat sich geaendert.';
                perform recalculate_total_points_kartierabschnitt_func(NEW.id);
            ELSEIF (NEW.stationierung_von IS NOT NULL AND
                   NEW.stationierung_von != OLD.stationierung_von) THEN
                RAISE DEBUG 'Stationierung VON hat sich geaendert.';
                perform recalculate_total_points_kartierabschnitt_func(NEW.id);
            ELSEIF (NEW.stationierung_bis IS NOT NULL AND
                   NEW.stationierung_bis != OLD.stationierung_bis) THEN
                RAISE DEBUG 'Stationierung BIS hat sich geaendert.';
                perform recalculate_total_points_kartierabschnitt_func(NEW.id);
            ELSEIF (NEW.sonderfall_id IS NULL AND OLD.sonderfall_id IS NOT
            NULL) THEN
                RAISE DEBUG 'Sonderfall wurde entfernt.';
                PERFORM recalculate_total_points_kartierabschnitt_func(NEW.id);
            ELSEIF (NEW.sonderfall_id IS NOT NULL AND Old.sonderfall_id IS
                    NULL) THEN
                RAISE DEBUG 'Bewertung wird entfernt, da Sonderfall vorhanden.';
                PERFORM delete_bewertung_func(NEW.id);
            END IF;
        END IF;
    END IF;

    RETURN NEW;

END;
$$ LANGUAGE plpgsql;

--
-- remove existing triggers before creating new ones
--
DROP TRIGGER IF EXISTS update_gewaessertyp_kartierabschnitt
ON kartierabschnitt;


--
-- necessary trigger for table kartierabschnitt
--
CREATE TRIGGER update_gewaessertyp_kartierabschnitt
AFTER UPDATE
    ON kartierabschnitt
    FOR EACH ROW EXECUTE PROCEDURE
        update_gewaessertyp_kartierabschnitt_func();
        
-- END TRANSACTION
END;
