-- 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;

-- A trigger that resets a field 'keine' (set value = 0) in an m:n table
CREATE OR REPLACE FUNCTION reset_keine_uferstrukturen_func()
RETURNS TRIGGER AS
$$
DECLARE
    keine_id integer;

BEGIN
    SELECT id INTO keine_id
        FROM  uferstrukturen
        WHERE kurzbeschreibung = 'keine';

    IF keine_id IS NOT NULL THEN
        IF keine_id = NEW.uferstrukturen_id THEN
            RETURN NEW;
        END IF;

        IF NEW.anzahl_links > 0 THEN
            UPDATE uferstruktur_hat_uferstrukturen SET anzahl_links = 0
            WHERE  kartierabschnitt_id = NEW.kartierabschnitt_id
                AND uferstrukturen_id = keine_id;
        END IF;

        IF NEW.anzahl_rechts > 0 THEN
            UPDATE uferstruktur_hat_uferstrukturen SET anzahl_rechts = 0
            WHERE  kartierabschnitt_id = NEW.kartierabschnitt_id
                AND uferstrukturen_id = keine_id;
        END IF;
    END IF;

    RETURN NEW;
END;
$$ LANGUAGE plpgsql;


CREATE TRIGGER update_uferstruktur_hat_uferstrukturen AFTER INSERT OR UPDATE
    ON uferstruktur_hat_uferstrukturen
    FOR EACH ROW EXECUTE PROCEDURE reset_keine_uferstrukturen_func();



-- A trigger that resets a field 'keine' (set value = 0) in an m:n table
CREATE OR REPLACE FUNCTION reset_keine_belastungen_func()
RETURNS TRIGGER AS
$$
DECLARE
    keine_id integer;

BEGIN
    SELECT id INTO keine_id
        FROM  uferbelastungen
        WHERE kurzbeschreibung = 'keine';

    IF keine_id IS NOT NULL THEN
        IF keine_id = NEW.uferbelastungen_id THEN
            RETURN NEW;
        END IF;

        IF NEW.anzahl_links > 0 THEN
            UPDATE uferstruktur_hat_uferbelastungen SET anzahl_links = 0
            WHERE  kartierabschnitt_id = NEW.kartierabschnitt_id
                AND uferbelastungen_id = keine_id;
        END IF;

        IF NEW.anzahl_rechts > 0 THEN
            UPDATE uferstruktur_hat_uferbelastungen SET anzahl_rechts = 0
            WHERE  kartierabschnitt_id = NEW.kartierabschnitt_id
                AND uferbelastungen_id = keine_id;
        END IF;
    END IF;

    RETURN NEW;
END;
$$ LANGUAGE plpgsql;


CREATE TRIGGER update_uferstruktur_hat_uferbelastungen AFTER INSERT OR UPDATE
    ON uferstruktur_hat_uferbelastungen
    FOR EACH ROW EXECUTE PROCEDURE reset_keine_belastungen_func();

END;


-- A trigger that resets a field 'keine' (set value = 0) in an m:n table
CREATE OR REPLACE FUNCTION reset_keine_laengsbaenke_func()
RETURNS TRIGGER AS
$$
DECLARE
    keine_id integer;

BEGIN
    SELECT id INTO keine_id
        FROM  laengsbaenke
        WHERE kurzbeschreibung = 'keine';

    IF keine_id IS NOT NULL THEN
        IF keine_id = NEW.laengsbaenke_id THEN
            RETURN NEW;
        END IF;

        IF NEW.anzahl > 0 THEN
            UPDATE laufentwicklung_hat_laengsbaenke SET anzahl = 0
            WHERE  kartierabschnitt_id = NEW.kartierabschnitt_id
                AND laengsbaenke_id = keine_id;
        END IF;
    END IF;

    RETURN NEW;
END;
$$ LANGUAGE plpgsql;


CREATE TRIGGER update_laufentwicklung_hat_laengsbaenke AFTER INSERT OR UPDATE
    ON laufentwicklung_hat_laengsbaenke
    FOR EACH ROW EXECUTE PROCEDURE reset_keine_laengsbaenke_func();


-- A trigger that resets a field 'keine' (set value = 0) in an m:n table
CREATE OR REPLACE FUNCTION reset_keine_laufstrukturen_func()
RETURNS TRIGGER AS
$$
DECLARE
    keine_id integer;

BEGIN
    SELECT id INTO keine_id
        FROM  laufstrukturen
        WHERE kurzbeschreibung = 'keine';

    IF keine_id IS NOT NULL THEN
        IF keine_id = NEW.laufstrukturen_id THEN
            RETURN NEW;
        END IF;

        IF NEW.anzahl > 0 THEN
            UPDATE laufentwicklung_hat_laufstrukturen SET anzahl = 0
            WHERE  kartierabschnitt_id = NEW.kartierabschnitt_id
                AND laufstrukturen_id = keine_id;
        END IF;
    END IF;

    RETURN NEW;
END;
$$ LANGUAGE plpgsql;


CREATE TRIGGER update_laufentwicklung_hat_laufstrukturen AFTER INSERT OR UPDATE
    ON laufentwicklung_hat_laufstrukturen
    FOR EACH ROW EXECUTE PROCEDURE reset_keine_laufstrukturen_func();

END;


-- A trigger that resets a field 'keine' (set value = 0) in an m:n table
CREATE OR REPLACE FUNCTION reset_keine_sohlenstrukturen_func()
RETURNS TRIGGER AS
$$
DECLARE
    keine_id integer;

BEGIN
    SELECT id INTO keine_id
        FROM  sohlenstrukturen
        WHERE kurzbeschreibung = 'keine';

    IF keine_id IS NOT NULL THEN
        IF keine_id = NEW.sohlenstruktur_id THEN
            RETURN NEW;
        END IF;

        IF NEW.anzahl > 0 THEN
            UPDATE sohlenstruktur_hat_sohlenstrukturen SET anzahl = 0
            WHERE  kartierabschnitt_id = NEW.kartierabschnitt_id
                AND sohlenstruktur_id = keine_id;
        END IF;
    END IF;

    RETURN NEW;
END;
$$ LANGUAGE plpgsql;


CREATE TRIGGER update_sohlenstruktur_hat_sohlenstrukturen AFTER INSERT OR UPDATE
    ON sohlenstruktur_hat_sohlenstrukturen
    FOR EACH ROW EXECUTE PROCEDURE reset_keine_sohlenstrukturen_func();


-- A trigger that resets a field 'keine' (set value = 0) in an m:n table
CREATE OR REPLACE FUNCTION reset_keine_sohlenbelastungen_func()
RETURNS TRIGGER AS
$$
DECLARE
    keine_id integer;

BEGIN
    SELECT id INTO keine_id
        FROM  belastung_sohle
        WHERE kurzbeschreibung = 'keine';

    IF keine_id IS NOT NULL THEN
        IF keine_id = NEW.belastung_sohle_id THEN
            RETURN NEW;
        END IF;

        IF NEW.anzahl > 0 THEN
            UPDATE sohlenstruktur_hat_belastung_sohle SET anzahl = 0
            WHERE  kartierabschnitt_id = NEW.kartierabschnitt_id
                AND belastung_sohle_id = keine_id;
        END IF;
    END IF;

    RETURN NEW;
END;
$$ LANGUAGE plpgsql;


CREATE TRIGGER update_sohlenstruktur_hat_sohlenbelastungen AFTER INSERT OR UPDATE
    ON sohlenstruktur_hat_belastung_sohle
    FOR EACH ROW EXECUTE PROCEDURE reset_keine_sohlenbelastungen_func();


-- A trigger that resets a field 'keine' (set value = 0) in an m:n table
CREATE OR REPLACE FUNCTION reset_keine_sohlensubstrate_func()
RETURNS TRIGGER AS
$$
DECLARE
    nicht integer;

BEGIN
    SELECT id INTO nicht
        FROM  sohlensubstrat
        WHERE beschreibung = 'nicht einschätzbar';

    IF nicht IS NOT NULL THEN
        IF nicht = NEW.sohlensubstrat_id THEN
            RETURN NEW;
        END IF;

        IF NEW.percentage > 0 THEN
            UPDATE sohlenstruktur_hat_sohlensubstrat SET percentage = 0
            WHERE  kartierabschnitt_id = NEW.kartierabschnitt_id
                AND sohlensubstrat_id = nicht;
        END IF;
    END IF;

    RETURN NEW;
END;
$$ LANGUAGE plpgsql;


CREATE TRIGGER update_sohlenstruktur_hat_sohlensubstrat AFTER INSERT OR UPDATE
    ON sohlenstruktur_hat_sohlensubstrat
    FOR EACH ROW EXECUTE PROCEDURE reset_keine_sohlensubstrate_func();

END;
