library(prioritizr)
# devtools::load_all()
# devtools::install_local(force=T)
# devtools::install_github("ecoquants/bbnj")
library(bbnj)
library(raster)
library(sf)
library(dplyr)
library(readr)
library(stringr)
library(glue)
library(here)
library(fs)
library(knitr)
library(formattable)
library(lwgeom)
library(purrr)
library(ggplot2)
library(formattable)
library(knitr)
library(ggplot2)
library(plotly)
library(units)
library(RColorBrewer)

area   = raster::area
select = dplyr::select

# set rainbow color palette

#RColorBrewer::display.brewer.all()
pal  <- colorRampPalette(brewer.pal(9, "YlOrRd"))
#pal  <- colorRampPalette(brewer.pal(11, "Reds"))
#cols <- rev(pal(255))
cols <- pal(255)

Features

Source of features: s04a.biofish.alltime.mol50km.Rmd.

# borrowed from: ~/github/bbnj/inst/app/www/scenarios/
#                s04a.biofish.alltime.mol50km.Rmd

data("projections_tbl")

prjres     <- "_mol50km" # prjres in: View(projections_tbl)

P <- projections_tbl %>% filter(prjres == !!prjres)

# planning unit: ----
r_pu_id <- get_d_prjres("r_pu_id", prjres) #plot(r_pu_id)

# r_pu <- setValues(r_pu_id, 1) %>%
#   mask(r_pu_id) # plot(r_pu)

# cost layer: fishing profitability ----
r_fish_effort <- get_d_prjres("s_fish_gfw", prjres)%>%
  subset("fishing_KWH")

# apply cost to planning units
r_pu <- r_fish_effort %>% 
  reclassify(rcl=cbind(-Inf, 112774, NA), right=TRUE) %>% 
  gap_fill_raster(r_mask=r_pu_id)

# biodiversity: now + 2100 by taxonomic group----
s_bio_gmbi_now <- get_gmbi_grpsmdl_prjres("groups02", prjres)
lyrs_bio_now <- names(s_bio_gmbi_now) %>% 
  setdiff(str_subset(names(s_bio_gmbi_now), "rli")) %>% 
  setdiff(str_subset(names(s_bio_gmbi_now), "rls"))
s_bio_gmbi_now <- subset(s_bio_gmbi_now, lyrs_bio_now)

s_bio_gmbi_future <- get_gmbi_grpsmdl_prjres("groups02_2100", prjres)
lyrs_bio_future <- names(s_bio_gmbi_future) %>% 
  setdiff(str_subset(names(s_bio_gmbi_future), "rli")) %>% 
  setdiff(str_subset(names(s_bio_gmbi_future), "rls"))
s_bio_gmbi_future <- subset(s_bio_gmbi_future, lyrs_bio_future)

# biodiversity nspp_all----
s_bio_now_all <- get_gmbi_grpsmdl_prjres("groups00", prjres) %>% 
  subset("groups00_nspp_all")

# rls now + 2100----
rls_all_now <- get_gmbi_grpsmdl_prjres("groups00", prjres) %>% 
  subset("groups00_rls_all")

rls_all_future <- get_gmbi_grpsmdl_prjres("groups00_2100", prjres) %>% 
  subset("groups00_2100_rls_all")

# features ----
s_seamounts <- get_d_prjres("s_phys_seamounts",prjres)
lu_seamounts <- c(lteq200m="0to200",gt200lteq800m="gt200to800",gt800m="gt800")
lbls_seamounts <- sprintf("phys_seamounts_%sm", lu_seamounts[names(s_seamounts)])

s_features <- stack(
  get_d_prjres("r_vgpm", prjres),
  s_bio_gmbi_now,
  s_bio_gmbi_future,
  rls_all_now,
  rls_all_future,
  #raster(s_fish_gfw, "mean_scaled_profits_with_subsidies") %>%
  #    gap_fill_raster(r_mask=r_pu_id) %>%
  #    rescale_raster(inverse=T),
  #raster(s_fish_ubc, "mcp_2004"),
  s_seamounts,
  get_d_prjres("r_phys_vents",prjres),
  get_d_prjres("r_phys_scapes_hetero",prjres))

names(s_features) <- c(
  "bio_vgpm",
  gsub("^.*?_","",names(s_bio_gmbi_now)),
  #gsub("^.*?_","",names(s_bio_gmbi_future)),
  gsub("groups02_2100_nspp","nspp_2100",names(s_bio_gmbi_future)),
  "rls_all_now",
  "rls_all_future",
  #"fish_profit.subs"
  #"fish_mcp.2004",
  lbls_seamounts,
  "phys_vents",
  "scapes_hetero")
dir_png <- here("map_layers")
redo    <- T
  
s04 <- raster(here("../bbnj/inst/app/www/scenarios/s04a.biofish.alltime.mol50km_sol.tif"))
s04 <- mask(s04, s04, maskvalue=0)
P
## # A tibble: 1 x 8
##   prj   default name    proj                      epsg res_num res   prjres
##   <chr> <lgl>   <chr>   <chr>                    <dbl>   <dbl> <chr> <chr> 
## 1 mol   FALSE   Mollwe… +proj=moll +lon_0=0 +x_… 54009   50000 50km  _mol5…
s04_sf <- read_sf(here("../bbnj/inst/app/www/scenarios/s04a.biofish.alltime.mol50km_sol_gcs.shp")) %>%
  st_transform(P$epsg)
  
s04 <- mask(s04, s04, maskvalue=0)

summary25pct_csv <- glue("{dir_png}/_summary25pct.csv")

cell_km2   <- prod(res(r_pu)) %>% as_units("m2") %>% set_units("km2")
hs_ncells  <- length(na.omit(values(r_pu_id)))
hs_areakm2 <- hs_ncells * cell_km2

countries <- rnaturalearth::ne_countries(returnclass = "sf") %>%
  st_transform(P$epsg)
graticules <- st_graticule(countries)

# TODO
for (i in nlayers(s_features)){  i = 1
#for (i in 1:5){ # i = 1
  
  r   <- raster(s_features, 1)
  lyr <- names(s_features)[1]
  
  r_tif      <- glue("{dir_png}/{lyr}.tif")
  map_png    <- glue("{dir_png}/{lyr}_map.png")
  map25_png  <- glue("{dir_png}/{lyr}_map25.png")
  hist25_png <- glue("{dir_png}/{lyr}_hist25.png")
  message(glue("{i}/{nlayers(s_features)}: {lyr}"))
  
  # write raster ----
  if (!file.exists(r_tif)){
    message("  writeRaster")
    writeRaster(r, r_tif)
  }
  
  P   <- get_tif_projection(r_tif)

  # values ----
  v <- values(r) %>% na.omit() %>% sort(decreasing = T)
  d <- tibble(v = v) %>% 
    filter(v > 0) %>% 
    mutate(
      v_cumsum    = cumsum(v),
      i           = 1:length(v),
      cumarea_km2 = i * cell_km2 %>% drop_units(),
      pct_totval  = v_cumsum/sum(v) * 100,
      pct_hsarea  = cumarea_km2/hs_areakm2 %>% drop_units() * 100)
  
  d_25 <- d %>% 
    filter(v_cumsum <= sum(v)*.25)
  
  if (nrow(d_25) == 0){
    d_25 <- d %>% slice(1)
  }
    
  v_at25     <- min(d_25$v)
  pcths_at25 <- max(d_25$pct_hsarea)
  title  <- glue("{lyr} — 25%: {round(pcths_at25, digits=2)}% hs >= {signif(v_at25)}")

  D_i <- tibble(
    lyr        = lyr,
    v_at25     = v_at25,
    pcths_at25 = pcths_at25)
  
  if (!file.exists(summary25pct_csv)){
    write_csv(D_i, summary25pct_csv)
  } else {
    read_csv(summary25pct_csv) %>% 
      filter(lyr != !!lyr) %>% 
      bind_rows(D_i) %>% 
      write_csv(summary25pct_csv)
  }
  
  # hist ----
  if (!file.exists(hist25_png) | redo){
    message("  hist25_png")
    #png(hist25_png, width=480*4, height = 480*4, res=300, units='px')
    p <- ggplot(d, aes(x=pct_hsarea, y=pct_totval)) + 
      geom_area(fill="gray70", color=NA) + 
      geom_area(data=d_25, aes(x=pct_hsarea, y=pct_totval), fill="gray10", color=NA) + 
      scale_fill_distiller("spectral") +
      theme_light() + 
      coord_cartesian(expand = F) +
      #scale_x_continuous(labels = scales::percent_format()) %>% 
      scale_x_continuous(labels = scales::percent_format(accuracy = 3)) %>% 
      scale_y_continuous(labels = scales::percent_format()) %>% 
      labs(
        title = title, 
        x="% high seas area", y="% total value")
    ggsave(
      hist25_png,
      p, 
      "png", width=6.4, height=6.4, dpi=300, units='in')
    #dev.off()
  }
  
  # map 25 ----
  if (!file.exists(map25_png)){
    message("  map25_png")

    r_v   <- mask(r, r >= v_at25, maskvalue=0)
    v_rng <- range(values(r), na.rm = T)
    pct_at25_4cols <- (v_rng[2] - v_at25) / (v_rng[2] - v_rng[1])
    
    png(map25_png, width=480*4, height = 480*4, res=300, units='px')
    
    cols_v <- cols[1:round(length(cols)*pct_at25_4cols)]

    # simple map
    plot(r, col = scales::alpha(cols, 0.2), legend=F, axes=F, box=F, 
         legend.mar = 3.1, legend.shrink = 0.3)
    plot(r_v, col = cols_v, legend=F, add=T)
    contour(r, add=T, levels=v_at25, col="red", lwd = 0.5)
    plot(s04_sf[1], col=scales::alpha("blue", 0.15), border=scales::alpha("blue", 0.25), lwd=0.5, add=T)
    plot(countries[1], col=gray(0.8), border=gray(0.7), lwd=0.5, add=T)
    plot(graticules[1], col=gray(0.6), lwd=0.5, add=T)
    plot(r, col = cols, legend.only=T, #legend.width = 1,
         legend.shrink = 0.3, legend.mar = 3.1,
         legend.args = list(text = lyr, side = 3, 
         font = 2, line = 0.2, cex = 0.5),
         axis.args = list(cex.axis = 0.5))

    dev.off()
    
    map25_png %>%
      magick::image_read() %>% magick::image_trim() %>%
      magick::image_write(map25_png)
  }
  
  # map ----
  if (!file.exists(map_png) | redo){
    message("  map_png")
    png(map_png, width=480*4, height = 480*4, res=300, units='px')
    
    #table(values(r))
    plot(r, col = cols, legend=T, axes=F, box=F, main=lyr)
    plot(s04, alpha=0.5, legend=F, axes=F, box=F)
    plot(st_geometry(countries), add=T, col=gray(0.8), border=gray(0.7), lwd=0.5)
    plot(st_geometry(graticules), add=T, col=gray(0.6), lwd=0.5)
    
    dev.off()
    map_png %>%
      magick::image_read() %>% magick::image_trim() %>%
      magick::image_write(map_png)
  }
}
# read in s04
s04 <- raster(here("../bbnj/inst/app/www/scenarios/s04a.biofish.alltime.mol50km_sol.tif"))
s04 <- mask(s04, s04, maskvalue=0)

s04_sf <- read_sf(here("../bbnj/inst/app/www/scenarios/s04a.biofish.alltime.mol50km_sol_gcs.shp")) %>%
  st_transform(P$epsg)
  
s04 <- mask(s04, s04, maskvalue=0)

highlights2<-read_sf(here("../bbnj-scripts/highlights/s04highlights_group2.shp"))%>%
  st_transform(P$epsg)

highlights1<-read_sf(here("../bbnj-scripts/highlights/s04highlights_group1.shp"))%>%
  st_transform(P$epsg)

# countries
countries <- rnaturalearth::ne_countries(returnclass = "sf") %>%
  st_transform(P$epsg)
graticules <- st_graticule(countries)

#top quartile biodiversity now all
s_bio_now_all_v25<-quantile(s_bio_now_all, probs=0.75)

s_bio_now_all_25<- s_bio_now_all %>% 
  reclassify(rcl=cbind(-Inf,s_bio_now_all_v25,NA), right=TRUE)

  dir_png <- here("../bbnj-scripts/map_layers")
  map_png <- glue("{dir_png}/nspp_all_25.png")

png(map_png, width=480*6, height = 480*6, res=300, type="cairo", units='px', bg = "transparent")

plot(s_bio_now_all, col=rev( rainbow(30, start=0,end=0.7 ) ), breaks=seq(min(minValue(s_bio_now_all)),max(maxValue(s_bio_now_all)),length.out=100), alpha=0.2, legend=F, axes=F, box=F)
plot(s_bio_now_all_25, col=rev( rainbow(30, start=0,end=0.7 ) ), breaks=seq(min(minValue(s_bio_now_all)),max(maxValue(s_bio_now_all)),length.out=100), legend=F, axes=F, box=F, add=T)
plot(countries[1], col=gray(0.8), border=gray(0.7), lwd=0.5, add=T)
plot(graticules[1], col=gray(0.6), lwd=0.5, add=T)
plot(s04_sf[1], col=scales::alpha("black", 0.3), border=scales::alpha("black", 0.5), lwd=0.5, add=T)
plot(highlights1[1], col="orange",pch=19, cex=0.4,add=T)
plot(highlights2[1], col="orange",pch=19, cex=0.4,add=T)

dev.off()
D <- read_csv(summary30pct_csv)

if (exists("s_b")) rm(s_b)
r_sol <- r_pu - 1 # plot(R_b)
for (i in 1:nlayers(s_features)){ # i = 3
  
  r <- s_features[[i]]
  lyr <- names(s_features)[i]
  
  v_at30 <- D %>% 
    filter(lyr == !!lyr) %>% 
    pull(v_at30)
  
  r_sol[r >= v_at30] <- 1
  
  sol_areakm2  <- sum(values(r_sol), na.rm = T) * cell_km2
  pct_sol_hs <-  sol_areakm2 / hs_areakm2 * 100 # 84.47849 % high seas
  title <- glue("{i}/{nlayers(s_features)}: +{lyr}, {round(pct_sol_hs, digits=2)}% hs")
  
  Sys.sleep(1)
  plot(r_sol, main = title)
}
sol30_tif <- glue("{dir_png}/sol30.tif")
sol30_map_png <- glue("{dir_png}/sol30_map.png")

writeRaster(r_sol, sol30_tif)

png(sol30_map_png, width=480*4, height = 480*4, res=300, units='px')
#table(values(r))
plot(r_sol, legend=F, axes=F, box=F)
plot(st_geometry(countries), add=T, col=gray(0.8), border=gray(0.7), lwd=0.5)
plot(st_geometry(graticules), add=T, col=gray(0.6), lwd=0.5)
dev.off()
sol30_map_png %>%
  magick::image_read() %>% magick::image_trim() %>%
  magick::image_write(sol30_map_png)
  r <- r_fish_effort
  lyr <- names(r_fish_effort)
  #plot(r)
  dir_png <- here("inst/scripts/map_layers")
  r_tif   <- glue("{dir_png}/{lyr}.tif")
  map_png <- glue("{dir_png}/{lyr}_map.png")
  
  writeRaster(r, r_tif, overwrite=T)
  
  P <- get_tif_projection(r_tif)
  
  pal <- colorRampPalette(brewer.pal(7, "YlOrRd"))
  cols <- (pal(7))
  
  # plot ----
  countries <- rnaturalearth::ne_countries(returnclass = "sf") %>%
    st_transform(P$epsg)
  graticules <- st_graticule(countries)
  
  png(map_png, width=480*4, height = 480*4, res=300, type="cairo", units='px', bg = "transparent")
  
  plot(r, breaks=c(0,10000,30000,100000,300000,1000000,5000000,108528675),col=cols, legend=F, axes=F, box=F)
  plot(eez, add=T, col=gray(0.9), legend=F)
  plot(st_geometry(countries), add=T, col=gray(0.8), border=gray(0.7), lwd=0.5)
  plot(st_geometry(graticules), add=T, col=gray(0.6), lwd=0.5)
  
  dev.off()
  map_png %>%
    magick::image_read() %>% magick::image_trim() %>%
    magick::image_write(map_png)
library(tidyr)
library(scales)

extract <- raster::extract

sol_shp <- here("inst/app/www/scenarios/s04a.biofish.alltime.mol50km_sol_gcs.shp")

sol_sf <- read_sf(sol_shp)

ply <- sol_sf %>% arrange(desc(are_km2)) %>% head(1)
# mapview::mapview(ply)

ply_mol_sp <- ply %>% st_transform(P$epsg) %>% as("Spatial")

d_ply <- extract(s_features, ply_mol_sp, df=T) %>% 
  as_tibble() %>% 
  select(-ID) %>% 
  gather("layer", "value") %>% 
  na.omit() %>% 
  mutate(
    source = "ply")

d_hs <- values(s_features) %>% 
  as_tibble() %>% 
  gather("layer", "value") %>% 
  na.omit() %>% 
  mutate(
    source = "hs")

d_vs <- bind_rows(
  d_hs,
  d_ply) %>% 
  mutate(
    score = rescale(value))

d_vs_avg <- d_vs %>% 
  group_by(source, layer) %>% 
  summarize(
    avg_score = mean(score))

d_vs_avg_w <- d_vs_avg %>% 
  ungroup() %>% 
  mutate(source = glue("avg_{source}")) %>% 
  spread(source, avg_score) %>% 
  mutate(
    pct_ply = avg_ply / avg_hs) %>% 
  arrange(desc(pct_ply))

# TODO: include s04 features
d_vs_avg_w # YES!

DT::datatable(d_vs_avg_w)
ggplot(d_vs, aes(x = score, y = layer, fill = source)) +
  #geom_density_ridges_gradient(scale = 3, rel_min_height = 0.01) +
  geom_density_ridges(alpha = .5, color = "white") #+
  # geom_segment(
  #   aes(x = avg_pct, y = layer, xend = avg_pct, yend = layer + 1),
  #   data = d_vs_avg)

  #geom_vline(aes(xintercept = avg, y = layer), data = d_vs_avg) +
  #theme_ridges(font_size = 20, grid=TRUE, line_size=1, 
  #             center_axis_labels=TRUE)
  #scale_fill_viridis(name = "Temp. [F]", option = "C") #+
  #scale_fill_distiller("spectral", name = "value") #+
  #scale_fill_gradientn(colors = cols, name = "value") #+

png(hist_png, width=480*4, height = 480*4, res=300, units='px')
ggplot(d_features, aes(x = value, y = layer, fill = ..x..)) +
  #geom_density_ridges_gradient(scale = 3, rel_min_height = 0.01) +
  geom_density_ridges_gradient() +
  
  #scale_fill_viridis(name = "Temp. [F]", option = "C") #+
  #scale_fill_distiller("spectral", name = "value") #+
  scale_fill_gradientn(colors = cols, name = "value") #+
#labs(title = 'Temperatures in Lincoln NE in 2016')
dev.off()


library(ggridges)
library(forcats)
Catalan_elections %>%
  mutate(YearFct = fct_rev(as.factor(Year))) %>%
  ggplot(aes(y = YearFct)) +
  geom_density_ridges(
    aes(x = Percent, fill = paste(YearFct, Option)), 
    alpha = .8, color = "white", from = 0, to = 100
  ) +
  labs(
    x = "Vote (%)",
    y = "Election Year",
    title = "Indy vs Unionist vote in Catalan elections",
    subtitle = "Analysis unit: municipalities (n = 949)",
    caption = "Marc Belzunces (@marcbeldata) | Source: Idescat"
  ) +
  scale_y_discrete(expand = c(0.01, 0)) +
  scale_x_continuous(expand = c(0.01, 0)) +
  scale_fill_cyclical(
    breaks = c("1980 Indy", "1980 Unionist"),
    labels = c(`1980 Indy` = "Indy", `1980 Unionist` = "Unionist"),
    values = c("#ff0000", "#0000ff", "#ff8080", "#8080ff"),
    name = "Option", guide = "legend"
  ) +
  theme_ridges(grid = FALSE)