-- Erhoeht Geld-Praezision fuer sehr hohe Kontostaende.
-- Ziel: max. Betrag von 99.999.999,99 auf 999.999.999.999,99 anheben.

-- Hauptkontostand
ALTER TABLE falukant_data.falukant_user
    ALTER COLUMN money TYPE NUMERIC(14,2);

-- Verlaufseintraege (best effort-Logging im Daemon)
ALTER TABLE falukant_log.money_history
    ALTER COLUMN change TYPE NUMERIC(14,2);

-- Moneyflow auf dieselbe Praezision bringen (falls die Tabelle existiert).
ALTER TABLE IF EXISTS falukant_log.moneyflow
    ALTER COLUMN money_before TYPE NUMERIC(14,2),
    ALTER COLUMN money_after TYPE NUMERIC(14,2),
    ALTER COLUMN change_value TYPE NUMERIC(14,2);

-- Kernfunktion auf neue Praezision umstellen.
CREATE OR REPLACE FUNCTION falukant_data.update_money(
    p_falukant_user_id integer,
    p_money_change numeric,
    p_activity text,
    p_changed_by integer DEFAULT NULL::integer
)
RETURNS void
LANGUAGE plpgsql
AS $function$
DECLARE
    v_money_before   numeric(14,2);
    v_money_after    numeric(14,2);
    v_moneyflow_id   bigint;
BEGIN
    SELECT money
      INTO v_money_before
      FROM falukant_data.falukant_user
     WHERE id = p_falukant_user_id;

    IF NOT FOUND THEN
        RAISE EXCEPTION 'FalukantUser mit ID % nicht gefunden', p_falukant_user_id;
    END IF;

    v_money_after := v_money_before + p_money_change;

    INSERT INTO falukant_log.moneyflow (
        falukant_user_id,
        activity,
        money_before,
        money_after,
        change_value,
        changed_by,
        time
    )
    VALUES (
        p_falukant_user_id,
        p_activity,
        v_money_before,
        NULL, -- wird gleich aktualisiert
        p_money_change,
        p_changed_by,
        NOW()
    )
    RETURNING id INTO v_moneyflow_id;

    UPDATE falukant_data.falukant_user
       SET money = v_money_after
     WHERE id = p_falukant_user_id;

    UPDATE falukant_log.moneyflow
       SET money_after = (
           SELECT money
             FROM falukant_data.falukant_user
            WHERE id = p_falukant_user_id
       )
     WHERE id = v_moneyflow_id;
END;
$function$;
