module Gis.Saga.Data where
import Gis.Saga.Types
import Gis.Saga.Utils
import System.Directory (removeFile)
import qualified Data.Map as M

-- | Implemented command for piping
sIoDB :: SagaIoCmdDB
sIoDB = M.fromList [
  ("xyzGridToGrid", (
      SagaCmd "io_grid" "6" ("FILENAME","GRID") -- library, module, input-,output-parameters
              (M.fromList [     --  parameters: sagaPipe-par, saga_cmd-par, default
                   ("cs",  ("CELLSIZE"  , "1"))
                  ,("sep", ("SEPARATOR" , "space"))
                  ])
              Nothing Nothing   -- pre-, post-processing
      , ".sgrd"                 --  output-file extension
      )
  )
  ,("lasToPtCld", (
       SagaCmd "io_shapes_las" "1" ("FILE", "POINTS")
       (M.fromList []) Nothing Nothing , ".spc"))
  ,("ptCldToGrid", (
       SagaCmd "pointcloud_tools" "4" ("POINTS","GRID")
       (M.fromList [
                   ("cs",  ("CELLSIZE"  , "1"))
                   ])
       Nothing Nothing ,".sgrd"))
  ,("gridFillGaps", (
       SagaCmd "grid_spline" "5" ("GRIDPOINTS","GRID_GRID")
       (M.fromList [("grdFlT", ("TARGET", "1"))])
       (Just copyGrid) Nothing, "_filled.sgrd"))
  ,("gridHillshade", (
       SagaCmd "ta_lighting" "0" ("ELEVATION","SHADE")
       (M.fromList []) Nothing Nothing , "_hillshade.sgrd"))
  ,("gridContour", (
       SagaCmd "shapes_grid" "5" ("INPUT","CONTOUR")
       (M.fromList [
            ("min" , ("ZMIN"  , "0"))
           ,("max" , ("ZMAX" , "10000"))
           ,("d",    ("ZSTEP" , "1"))
           ]) Nothing Nothing, "_contour.sgrd"))
  ,("gridPolyClip", (
       SagaCmd "shapes_grid" "7" ("INPUT","OUTPUT")
       (M.fromList [
           ("poly" , ("POLYGONS"  , "1"))
           ]) Nothing Nothing, "_polyClip.sgrd"))
  ,("gridTifHillshade", (
       SagaCmd "io_grid_image" "0" ("GRID","FILE")
       (M.fromList [
           ("pal" ,  ("COL_PALETTE", "2"))
          ,("colRev",("COL_REVERT" , "1"))
          ,("min",("STRETCH_MIN" , "0"))
          ,("max",("STRETCH_MAX" , "1.571"))
          --,("stddev",("STDDEV"   , "2"))
          --,("col",("COLOURING"   , "2"))
           ]) Nothing Nothing, ".tif"))
  ,("gridTifTerrain", (
       SagaCmd "io_grid_image" "0" ("GRID","FILE")
       (M.fromList [
           ("pal" ,  ("COL_PALETTE", "23"))
          --,("colRev",("COL_REVERT" , "1"))
          ,("min",("STRETCH_MIN" , "0"))
          ,("max",("STRETCH_MAX" , "100"))
          --,("stddev",("STDDEV"   , "2"))
          ,("col",("COLOURING"   , "2"))
           ]) Nothing Nothing, ".tif"))
  ,("gridTifGdal", (
       SagaCmd "io_gdal" "2" ("GRIDS","FILE")
       (M.fromList [
           ]) Nothing Nothing, ".tif"))
  ,("gdalGrid", (
       SagaCmd "io_gdal" "0" ("FILES", "GRIDS")
       (M.fromList [
           ]) Nothing Nothing, ".sgrd"))
  ,("gridXyz", (
         SagaCmd "io_grid" "5" ("GRIDS","FILENAME")
         (M.fromList [
             ]) Nothing Nothing, ".xyz"))
  ,("polyDissolve", (
         SagaCmd "shapes_polygons" "5" ("POLYGONS","DISSOLVED")
         (M.fromList [
           ("method" ,("DISSOLVE" , "0")) -- 0: polygons with same attribute value
                                         -- 1: all polygons
                                         -- 2: polygons with same attribute value (keep inner boundaries)
                                         -- 3: all polygons (keep inner boundaries)
          ,("f1",("FIELD_1"  , "1"))
          ,("f2",("FIELD_1"  , "-1"))
          ,("f3",("FIELD_1"  , "-1"))
         ])
         Nothing Nothing, "_disollved.shp"))
  ,("gridSlope", (
         SagaCmd "ta_morphometry" "0" ("ELEVATION","SLOPE")
         (M.fromList [
            ("aspect" ,("ASPECT" , "aspect"))
         ])
         Nothing Nothing, "_slope.sgrd"))
  ,("gridClassifyFlat", (
         SagaCmd "grid_tools" "15" ("INPUT","RESULT")
         (M.fromList [
            ("method" ,("METHOD" , "2")) -- 1: range
                                         -- 2: simple table
           ,("table" ,("RETAB" , "reclassify.txt"))
         ])
         (Just (\_ _ -> writeReclassifyTableFlatSlope "reclassify.txt"))
         (Just (\_ _ -> removeFile "reclassify.txt"))
                , "_reclassified.sgrd"))
  ,("gridClassToPoly", (
         SagaCmd "shapes_grid" "6" ("GRID","POLYGONS")
         (M.fromList [
           ("id",    ("CLASS_ID" , "1")) -- class identifier
          ,("all",   ("CLASS_ALL" , "0")) -- 0: one single class specified by class identifier
                                          -- 1: all classes
          ,("split",  ("SPLIT" , "0")) -- 0: one single (multi-)polygon object
                                       -- 1: each island as separated polygon
         ])
         Nothing Nothing, "_polygons.shp"))
  ]


-- | Pathsway nodes with input and output commands
sNodes :: NodeMap
sNodes =
  M.fromList [
    ("las", ([], ["lasToPtCld"]))
   ,("gdal", ([], ["gdalGrid"]))
   ,("ptc", (["lasToPtCld"], ["ptCldToGrid"]))
   ,("grid", (["ptCldToGrid", "xyzGridToGrid", "gdalGrid"],
      ["gridFillGaps", "gridTifGdal", "gridPolyClip"
      ,"gridSlope", "gridClassToPoly", "gridClassifyFlat"]))
   ,("xyz-grid", ([], ["xyzGridToGrid"]))
   ,("grid-filled", (["gridFillGaps"],
      ["gridHillshade", "gridXyz", "gridContour"]))
   ,("grid-filled-hillshade", (["gridHillshade"], ["gridTifHillshade"]))
   ,("grid-filled-hillshade-tif", (["gridTifHillshade"], []))
   ,("grid-hillshade", (["gridHillshade"], ["gridTifHillshade"]))
   ,("grid-hillshade-tif", (["gridTifHillshade"], []))
   ,("grid-filled-xyz", (["gridXyz"], []))
   ,("grid-filled-contour", (["gridContour"], []))
   ,("grid-polygonClip", (["gridPolyClip"], []))
  ]