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


CREATE OR REPLACE FUNCTION update_points_kartierabschnitt_func
                                            (id_kartierabschnitt INTEGER)
RETURNS NUMERIC AS
$$
DECLARE
    -- necessary meta information
    num_rating_laufentwicklung    INTEGER := 0;
    num_rating_laengsprofil       INTEGER := 0;
    num_rating_sohlenstruktur     INTEGER := 0;
    num_rating_querprofil         INTEGER := 0;
    num_rating_uferstruktur       INTEGER := 0;
    num_rating_gewaesserumfeld    INTEGER := 0;

    -- ratings
    rating_laufentwicklung        NUMERIC := 0;
    rating_laengsprofil           NUMERIC := 0;
    rating_sohlenstruktur         NUMERIC := 0;
    rating_querprofil             NUMERIC := 0;
    rating_uferstruktur           NUMERIC := 0;
    rating_gewaesserumfeld        NUMERIC := 0;
    rating_sohle                  NUMERIC := 0;
    rating_ufer                   NUMERIC := 0;
    rating_land                   NUMERIC := 0;
    rating_gesamt                 NUMERIC := 0;
BEGIN

    RAISE DEBUG '------- AUSWERTUNG GEWAESSERKLASSE -------';
    RAISE DEBUG 'Kartierabschnitt ID %', id_kartierabschnitt;
    --
    -- collect necessary meta information
    --
    --
    -- Rating for section Sohle
    --
    SELECT summe_punktzahl, anzahl_kriterien
           INTO rating_laufentwicklung, num_rating_laufentwicklung
           FROM laufentwicklung
           WHERE kartierabschnitt_id = id_kartierabschnitt;
    RAISE DEBUG 'Punktzahl Laufentwicklung %', rating_laufentwicklung;
    RAISE DEBUG 'Anzahl Kriterien Laufentwicklung %', num_rating_laufentwicklung;
    
    IF rating_laufentwicklung IS NULL or rating_laufentwicklung <= 0 THEN
        RAISE DEBUG 'Keine Bewertung fuer Laufentwicklung ==> Abbruch';
        RETURN id_kartierabschnitt;
    END IF;

    SELECT summe_punktzahl, anzahl_kriterien
           INTO rating_laengsprofil, num_rating_laengsprofil
           FROM laengsprofil
           WHERE kartierabschnitt_id = id_kartierabschnitt;
    RAISE DEBUG 'Punktzahl Laengsprofil %', rating_laengsprofil;
    RAISE DEBUG 'Anzahl Kriterien Laengsprofil %', num_rating_laengsprofil;

    IF rating_laengsprofil IS NULL or rating_laengsprofil <= 0 THEN
        RAISE DEBUG 'Keine Bewertung fuer Laengsprofil';
    END IF;

    SELECT summe_punktzahl, anzahl_kriterien
           INTO rating_sohlenstruktur, num_rating_sohlenstruktur
           FROM sohlenstruktur
           WHERE kartierabschnitt_id = id_kartierabschnitt;
    RAISE DEBUG 'Punktzahl Sohlenstruktur %', rating_sohlenstruktur;
    RAISE DEBUG 'Anzahl Kriterien Sohlenstruktur %', num_rating_sohlenstruktur;

    IF rating_sohlenstruktur IS NULL or rating_sohlenstruktur <= 0 THEN
        RAISE DEBUG 'Keine Bewertung fuer Sohlenstruktur ==> Abbruch';
        RETURN id_kartierabschnitt;
    END IF;

    rating_sohle := (rating_laufentwicklung + 
                     rating_laengsprofil + 
                     rating_sohlenstruktur) /
                     (num_rating_laufentwicklung + 
                      num_rating_laengsprofil + 
                      num_rating_sohlenstruktur);
    RAISE DEBUG '=> Bewertung Sohle %', rating_sohle;
    --
    -- Rating for section Ufer
    --
    SELECT summe_punktzahl, anzahl_kriterien
           INTO rating_querprofil, num_rating_querprofil
           FROM querprofil
           WHERE kartierabschnitt_id = id_kartierabschnitt;
    RAISE DEBUG 'Punktzahl Querprofil %', rating_querprofil;
    RAISE DEBUG 'Anzahl Kriterien Querprofil %', num_rating_querprofil;

    IF rating_querprofil IS NULL or rating_querprofil <= 0 THEN
        RAISE DEBUG 'Keine Bewertung fuer Querprofil ==> Abbruch';
        RETURN id_kartierabschnitt;
    END IF;

    SELECT summe_punktzahl, anzahl_kriterien
           INTO rating_uferstruktur, num_rating_uferstruktur
           FROM uferstruktur
           WHERE kartierabschnitt_id = id_kartierabschnitt;
    RAISE DEBUG 'Punktzahl Uferstruktur %', rating_uferstruktur;
    RAISE DEBUG 'Anzahl Kriterien Uferstruktur %', num_rating_uferstruktur;

    IF rating_uferstruktur IS NULL or rating_uferstruktur <= 0 THEN
        RAISE DEBUG 'Keine Bewertung fuer Uferstruktur ==> Abbruch';
        RETURN id_kartierabschnitt;
    END IF;

    rating_ufer := (rating_querprofil + rating_uferstruktur) /
                     (num_rating_querprofil + num_rating_uferstruktur);
    RAISE DEBUG '=> Bewertung Ufer %', rating_ufer;
    --
    -- Rating for section Land
    --
    SELECT summe_punktzahl, anzahl_kriterien
           INTO rating_gewaesserumfeld, num_rating_gewaesserumfeld
           FROM gewaesserumfeld
           WHERE kartierabschnitt_id = id_kartierabschnitt;
    RAISE DEBUG 'Punktzahl Gewaesserumfeld %', rating_gewaesserumfeld;
    RAISE DEBUG 'Anzahl Kriterien Gewaesserumfeld %', num_rating_gewaesserumfeld;

    IF rating_gewaesserumfeld IS NULL OR rating_gewaesserumfeld <= 0 THEN
        RAISE DEBUG 'Keine Bewertung fuer Gewaesserumfeld ==> Abbruch';
        RETURN id_kartierabschnitt;
    END IF;

    rating_land := rating_gewaesserumfeld / num_rating_gewaesserumfeld;
    RAISE DEBUG '=> Bewertung Land %', rating_land;
    
    
    rating_gesamt := ((rating_land + rating_ufer + rating_sohle) / 3.0);
    RAISE DEBUG '=> Bewertung Gesamt %', rating_gesamt;

    UPDATE kartierabschnitt
           SET punktzahl_gesamt = rating_gesamt ,
               punktzahl_sohle = rating_sohle,
               punktzahl_ufer = rating_ufer,
               punktzahl_land = rating_land
            WHERE id = id_kartierabschnitt;

    RETURN id_kartierabschnitt;

END;
$$ LANGUAGE plpgsql;

-- END TRANSACTION
END;
