# 
# RiskScape™ Copyright New Zealand Institute for Earth Science Limited
# (Earth Sciences New Zealand) is distributed for research purposes only
# under the terms of AGPLv3.
# 
# RiskScape™ Copyright 2026 New Zealand Institute for Earth Science
# Limited (Earth Sciences New Zealand). All rights reserved. Source code
# available under the AGPLv3.
# 
# This program is free software: you can redistribute it and/or modify it under
#  the terms of the GNU Affero General Public License as published by the Free
#  Software Foundation, either version 3 of the License, or (at your option) any
#  later version.
# 
# This program is distributed for RESEARCH PURPOSES ONLY, in the hope that it will
# be useful for research and education initiatives.
# 
# If you are not a researcher, or you are a researcher who wishes to use this
# program on terms other than AGPLv3 (including those who wish to restrict the
# distribution of any source code created using this program), please contact:
# https://riskscape.org.nz
# 
# This program is distributed WITHOUT ANY WARRANTY; without even the implied
# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Affero General Public License for more details.  You should have received a copy
# of the GNU Affero General Public License along with this program.  If not, see
# <http://www.gnu.org/licenses/>.
# 
# By way of summary only, under the AGPLv3:
#     • Permissions of this strongest copyleft license are conditioned
#       on making available complete source code of licensed works and
#       modifications, which include larger works using a licensed work,
#       under the same license.
#     • Copyright and license notices must be preserved.
#     • Contributors provide an express grant of patent rights.
#     • When a modified version is used to provide a service over a
#       network, the complete source code of the modified version must be made
#       available.
# 
[project]
description = A Getting Started example based on a Kaiju attack on NYC
functions = functions/kaiju-building-stomp-scorch.py

[type kaiju_attack]
type.geom = geometry
type.kaiju_name = text
type.severity = lookup('kaiju_attack_severity')

[type kaiju_attack_severity]
type = range(floating, 0, 10)

[type building]
type.geom = geometry
type.name = text
type.stories = integer
type.construction = enum('timber', 'concrete', 'steel','stone','brick')

[type building_attack_outcome]
type.damage = integer

[bookmark nyc_buildings]
description = A set of NYC landmark buildings
location = data/nyc-landmarks.csv
type = building
crs-name = EPSG:4326
map-attribute.geom = geom_from_wkt(WKT)
crs-longitude-first = true

[bookmark kaiju_route]
description = The route of our kaiju through NYC
location = data/kaiju-route.csv
type = kaiju_attack
crs-name = EPSG:4326
map-attribute.geom = geom_from_wkt(WKT)
crs-longitude-first = true

[bookmark kaiju_fire]
description = The intensity and extent of the fire blast attacks
location = data/kaiju-fire.shp
type = kaiju_attack
map-attribute.kaiju_name = name
map-attribute.severity = intensity * time
map-attribute.geom = the_geom

[type boroughs]
type.geom = geometry
type.name = text

[bookmark nyc_boroughs]
description = A map showing the outlines of the NYC boroughs and islands
location = data/new-york.csv
type = boroughs
crs-name = EPSG:4326
crs-longitude-first = true
map-attribute.geom = geom_from_wkt(WKT)

[function kaiju_stomp]
framework = expression
argument-types = [lookup('building'), nullable(lookup('kaiju_attack'))]
source = '''
(building, stomp) ->
  map(if(building.construction = 'timber',
    then: 1,
    else: () ->
      if(building.construction = 'concrete',
        then: () ->
          if (building.stories > 18, then: 5, else: 7),
        else: () ->
          if (building.construction = 'steel',
            then: () ->
              if (building.stories > 80,
                then: 3,
                else:
                  if (building.stories > 55,
                    then: 5,
                    else: 9
                  )
              ),
            else: 4
          )
      )
  ), resilience -> {
    resilience: resilience,
    damage: (10 - resilience) * severity
  })
'''

[model sample_overlapping_polygons]
framework = pipeline
description = pipeline that checks sample() will match overlapping polygons
# NB: Trump Tower fully overlaps two of the hazard polygons, The Plaza Hotel partially overlaps
source = input('nyc_buildings', name: 'building') \
    -> filter(building.name = 'Trump Tower' or building.name = 'The Plaza Hotel') \
    -> select({*, map(sample_intersections(building, to_coverage(bookmark('overlapping-polygons.gpkg'))), h -> h.sampled.severity) as sampled }) \
    -> select({ building.name, length(sampled) as num, min(sampled) as min, max(sampled) as max }) \
    -> sort(name) as results

[model bookmark_params]
framework = pipeline
description = pipeline with bookmark/template parameters
source = input($buildings, name: 'building') \
    -> select({*, sample_closest(building, to_coverage($hazard)) as sampled }) \
    -> filter(sampled.severity > 0) \
    -> group({ count(*) as Num_buildings, round(mean(building.stories), 2) as Average_stories }) as results
param.buildings = data/nyc-landmarks.csv
param.buildings.properties = bookmark-template: nyc_buildings
param.hazard = overlapping-polygons.gpkg
param.hazard.properties = bookmark
