#!/bin/bash
# Watershed Pipeline — Friz 🦎
# Usage: bash watershed_pipeline.sh DTM.tif [soglia] [outdir]
#  
# Example:
#   bash watershed_pipeline.sh DTM_UTM37_100_Croped.tif 1100 ~/output
#
# Dependencies: grass-core, r.stream.order extension, ogr2ogr, zip

set -euo pipefail

DTM="${1:?Missing DTM file}"
THRESHOLD="${2:-1100}"
OUTDIR="${3:-$(pwd)/watershed_$(date +%Y%m%d_%H%M%S)}"

TAG=$(basename "$DTM" | sed 's/.tif//;s/.TIFF//')
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
LOCATION="$OUTDIR/grassdata/${TAG}_${TIMESTAMP}"

mkdir -p "$OUTDIR"
echo "🚀 Watershed Pipeline"
echo "   DTM:      $DTM"
echo "   Soglia:   $THRESHOLD (~$(( THRESHOLD * 900 / 10000 )) ha/bacino)"
echo "   Output:   $OUTDIR"
echo ""

# 1. GRASS location
echo "[1/8] Creazione location GRASS..."
grass -c "$DTM" -e "$LOCATION" 2>/dev/null

# 2. Import DTM
echo "[2/8] Import DTM..."
grass "$LOCATION/PERMANENT" --exec r.in.gdal -o input="$DTM" output=dem --overwrite 2>/dev/null
grass "$LOCATION/PERMANENT" --exec g.region raster=dem

# 3. r.watershed
echo "[3/8] r.watershed (soglia=$THRESHOLD)..."
grass "$LOCATION/PERMANENT" --exec r.watershed -a elevation=dem accumulation=acc drainage=dir stream=str basin=ws threshold="$THRESHOLD"

# 4. Strahler
echo "[4/8] r.stream.order..."
grass "$LOCATION/PERMANENT" --exec r.stream.order elevation=dem stream_rast=str strahler=str_order direction=dir

# 5. Stream vector
echo "[5/8] Stream vector..."
grass "$LOCATION/PERMANENT" --exec r.thin input=str output=str_th
grass "$LOCATION/PERMANENT" --exec r.to.vect -s input=str_th output=str_lines type=line
grass "$LOCATION/PERMANENT" --exec v.db.addcolumn map=str_lines columns="strahler integer"
grass "$LOCATION/PERMANENT" --exec v.rast.stats map=str_lines raster=str_order method=average column_prefix=ord
grass "$LOCATION/PERMANENT" --exec db.execute sql="UPDATE str_lines SET strahler = ROUND(ord_average)"
grass "$LOCATION/PERMANENT" --exec v.db.dropcolumn map=str_lines columns="ord_average,value,label"
grass "$LOCATION/PERMANENT" --exec v.out.ogr input=str_lines output="$OUTDIR/streams.shp" format=ESRI_Shapefile --overwrite

# 6. Watershed vector
echo "[6/8] Watershed vector..."
grass "$LOCATION/PERMANENT" --exec r.to.vect -s input=ws output=ws_v type=area
grass "$LOCATION/PERMANENT" --exec v.out.ogr input=ws_v output="$OUTDIR/watershed.shp" format=ESRI_Shapefile --overwrite
# Add area_ha (colonna nel SHP)
ogr2ogr -f "ESRI Shapefile" -overwrite -nln watershed -addfields -lco FID=cat "$OUTDIR/watershed_fix.shp" "$OUTDIR/watershed.shp" 2>/dev/null
ogrinfo "$OUTDIR/watershed_fix.shp" -sql "ALTER TABLE watershed_fix ADD COLUMN area_ha REAL" 2>/dev/null || true
ogrinfo "$OUTDIR/watershed_fix.shp" -sql "UPDATE watershed_fix SET area_ha = ROUND(ST_Area(geom) / 10000.0, 1)" 2>/dev/null || true
# Rename
mv "$OUTDIR/watershed_fix.shp" "$OUTDIR/watershed.shp"
for ext in dbf prj shx; do
  [ -f "$OUTDIR/watershed_fix.$ext" ] && mv "$OUTDIR/watershed_fix.$ext" "$OUTDIR/watershed.$ext"
done

# 7. GPKG
echo "[7/8] GeoPackage..."
ogr2ogr -f GPKG "$OUTDIR/watershed.gpkg" "$OUTDIR/streams.shp" -nln streams -overwrite
ogr2ogr -f GPKG -update "$OUTDIR/watershed.gpkg" "$OUTDIR/watershed.shp" -nln watershed -overwrite
# Fix area_ha via SQL (MOLTO PIÙ AFFIDABILE di v.to.db)
ogrinfo "$OUTDIR/watershed.gpkg" -sql "UPDATE watershed SET area_ha = ROUND(ST_Area(geom) / 10000.0, 1)" 2>/dev/null

# 8. ZIP + Stats
echo "[8/8] ZIP + Stats..."
cd "$OUTDIR"
zip -9 watershed.zip streams.* watershed.* 2>/dev/null
rm -f watershed_fix.* 2>/dev/null

echo ""
echo "📊 Statistiche:"
ogrinfo -q -dialect SQLite -sql "SELECT strahler, COUNT(*) as n FROM streams GROUP BY strahler ORDER BY strahler" streams.shp 2>/dev/null
echo ""
ogrinfo -q -dialect SQLite -sql "SELECT ROUND(MIN(area_ha)) as min_ha, ROUND(AVG(area_ha)) as avg_ha, ROUND(MAX(area_ha)) as max_ha, ROUND(SUM(area_ha)) as total_ha FROM watershed WHERE area_ha > 1" watershed.shp 2>/dev/null
echo ""
echo "✅ Completato! File in: $OUTDIR"
ls -lh "$OUTDIR"/*.shp "$OUTDIR"/*.gpkg "$OUTDIR"/*.zip 2>/dev/null
echo ""
echo "📦 Consegna: cp $OUTDIR/* /home/buldo/.hermes/generated/"
echo "🌐 URL: http://100.86.154.25:8088/"
