#'------------------------------------------------------------------------------
#' Code to perform dispersal simulations of Cochliomyia hominivorax 
#' (Diptera: Calliphoridae) in North America.
#'
#'------------------------------------------------------------------------------
#'------------------------------------------------------------------------------
#' Inputs: 
#'        1) A csv with information of the initial dispersal locations 
#'           "initial_dispersal_location.csv" 
#'        2) A csv with the occurrence data of C. hominivorax used 
#'           to train niche models
#'           "occ_train_new_filter17km_70_30.csv"
#'        3) The suitability map of C. hominivorax
#'           "Suitability_7.tif"
#'        4) Binary maps with locations presenting 500 livestock heads
#'           "suitability7_binary_crop_cattle_500.tif"
#'------------------------------------------------------------------------------


# Load R packages

library(raster)
library(bamm)
library(furrr)
library(rio)
rm(list = ls())

# Read initial dispersal locations
occ_init <- rio::import("data/initial_dispersal_location.csv")
occ_initL <- occ_init |> split(occ_init$location)

# Training data of C. hominivorax
trainmosca <- rio::import("data/occ_train_new_filter17km_70_30.csv")

# Suitability map of C. hominivorax
smosca <- raster::raster("data/Suitability_7.tif")

# Suitability values of occurrences 
suits_mosca <- sort(raster::extract(smosca,trainmosca[,2:3]))

# Ten percentile threshold (this will be used to binarize the niche model)
tenper <- suits_mosca[ceiling(length(suits_mosca)*0.1)]

# Dispersal scenarios one and four pixels
dispersal_pixels <- c(1,4)
# Code to create connectivity matrices used in the bamm model
plan(multisession(workers = 2))
matrizAd <- seq_along(dispersal_pixels) |> furrr::future_map(function(x){
  smosca <- raster::raster("data/Suitability_7.tif")
  sganad <- raster::raster("data/suitability7_binary_crop_cattle_500.tif")
  smosca <- raster::crop(smosca,sganad)*sganad
  smod <- bamm::model2sparse(smosca,threshold = tenper)
  adm <- bamm::adj_mat(smod,ngbs = dispersal_pixels[x])
  return(adm)
},.progress = TRUE,
.options = furrr_options(seed = NULL,globals = c("occ_initL",
                                                 "tenper",
                                                 "dispersal_pixels")))
plan(sequential)
names(matrizAd) <- paste0("suitability7_binary_crop_cattle_500.tif","_ngbs_",
                          dispersal_pixels)

# Create the directory of simulation results
if(!dir.exists("simulation_results_img")) dir.create("simulation_results_img")

#'------------------------------------------------------------------------------
# Simulations
#'------------------------------------------------------------------------------

plan(multisession(workers = 8))
if(!dir.exists("simulation_results_img")) dir.create("simulation_results_img")
simulaciones <- seq_along(occ_initL) |> furrr::future_map(function(x){
  # Load the animation function
  source("scripts/00_animacion_func.R")
  occ_df <- occ_initL[[x]]
  smosca <- raster::raster("data/Suitability_7.tif")
  sganad <- raster::raster("data/suitability7_binary_crop_cattle_500.tif")
  smosca <- raster::crop(smosca,sganad)*sganad
  smod <- bamm::model2sparse(smosca,threshold = tenper)
  adj_mat_name <- paste0(occ_df$tif_path[1],"_ngbs_",occ_df$ngbs[1])
  adm <- matrizAd[[adj_mat_name]]
  dir_path <- paste0("simulation_results_img/ngbs_",occ_df$ngbs[1])
  if(!dir.exists(dir_path))
    dir.create(dir_path)
  # Initial dispersal locations
  occs_sparse <- bamm::occs2sparse(modelsparse = smod,
                                   occs = occ_df[,c("longitude","latitude")])
  # Path to save simulation results
  
  simu_path <- file.path(normalizePath(dir_path),
                         paste0(occ_df$location[1],".html"))
  # Function to run dispersal simulations
  bam_simulation <- bamm::sdm_sim(set_A = smod,
                                  set_M = adm,
                                  nsteps = 300,
                                  stochastic_dispersal = TRUE,
                                  disp_prop2_suitability = TRUE,
                                  disper_prop = 0.2,
                                  initial_points = occs_sparse)
  
  gif_simulation <- sim2Animation2(sdm_simul = bam_simulation,
                                   which_steps = 1:bam_simulation@sim_steps,
                                   fmt = "HTML",
                                   png_keyword = occ_df$location[1],
                                   filename = simu_path,
                                   gif_vel = 0.1,
                                   bg_color = "#F6F2E5", 
                                   suit_color = "#0076BE", 
                                   occupied_color = "#03C33F",
                                   ani.width = 1500, 
                                   ani.height = 1500, 
                                   ani.res = 300)
  
  
  
  return(bam_simulation)
  
  
},.options = furrr::furrr_options(globals = c("occ_initL",
                                              "matrizAd",
                                              "tenper"),
                                  seed = NULL),
.progress = TRUE)
plan(sequential)

