#' Check Channels
#' 
#' @description
#' Generates a map of the generated channel network layer. 
#' 
#' @details
#' Generates a simple map of the drainage network plotted over the contours to allow a visual assessment.
#' 
#' @param dem terra SpatRaster DEM that catchments were generated from
#' @param channels channel polyline (or channels list from \code{ch_wbt_channels}) (\pkg{terra} \code{SpatVector} object)
#' @param main_label Main label for channel plot.
#' @param channel_colour Colour for channel. Default is "blue".
#' @param pp_colour Colour for catchment pour points. Default is "red".
#' @param contour_colour Colour for contours Default is "grey".
#' @param outlet location of catchment outlet (\pkg{terra} \code{SpatVector}  object)
#'
#' @return 
#' \item{check_map}{a \pkg{ggplot} object of a map with channel layer}
#' 
#' @author Dan Moore Billy Browning and Joel Trubilowicz
#' @seealso \code{\link{ch_checkcatchment}}  
#' @importFrom ggplot2 ggplot coord_sf theme_bw 
#' @importFrom ggspatial annotation_north_arrow annotation_scale north_arrow_fancy_orienteering
#' @export
#' @examples 
#' # Only proceed if Whitebox executable is installed
#' library(whitebox)
#' if (check_whitebox_binary()){
#'   library(terra)
#'   test_raster <- ch_volcano_raster()
#'   dem_raster_file <- tempfile(fileext = c(".tif"))
#'   no_sink_raster_file <- tempfile("no_sinks", fileext = c(".tif"))
#' 
#'   # write test raster to file
#'   terra::writeRaster(test_raster, dem_raster_file)
#' 
#'   # remove sinks
#'   removed_sinks <- ch_wbt_removesinks(dem_raster_file, no_sink_raster_file, method = "fill")
#' 
#'   # get flow accumulations
#'   flow_acc_file <- tempfile("flow_acc", fileext = c(".tif"))
#'   flow_acc <- ch_wbt_flow_accumulation(no_sink_raster_file, flow_acc_file)
#' 
#'   # get flow directions
#'   flow_dir_file <- tempfile("flow_dir", fileext = c(".tif"))
#'   flow_dir <- ch_wbt_flow_direction(no_sink_raster_file, flow_dir_file)
#'   channel_raster_file <- tempfile("channels", fileext = c(".tif"))
#'   channel_vector_file <- tempfile("channels", fileext = c(".shp"))
#'   channels <- ch_wbt_channels(flow_acc_file, flow_dir_file, channel_raster_file,
#'                               channel_vector_file, 1)
#' 
#'   # get pour points
#'   pourpoint_file <- tempfile("volcano_pourpoints", fileext = ".shp")
#'   pourpoints <- ch_volcano_pourpoints(pourpoint_file)
#'   snapped_pourpoint_file <- tempfile("snapped_pourpoints", fileext = ".shp")
#'   snapped_pourpoints <- ch_wbt_pourpoints(pourpoints, flow_acc_file, pourpoint_file,
#'                                           snapped_pourpoint_file, snap_dist = 10)
#'   ch_checkchannels(test_raster, channels, snapped_pourpoints)
#' } else {
#'   message("Examples not run as Whitebox executable not found")
#' }
ch_checkchannels <- function(dem, channels, outlet = NULL, main_label = "",
                             channel_colour = "blue", pp_colour = "red",
                             contour_colour = "grey") {
  
  # check inputs
  if (missing(dem)) {
    stop("ch_checkchannels requires a raster dem to plot")
  }
  if (missing(channels)) {
    stop("ch_checkchannels requires SpatVector channels polyline to plot")
  }
  if (missing(outlet)) {
    stop("ch_checkchannels requires SpatVector outlet to plot")
  }
  
  contours <- ch_contours(dem)
  # get bounding box for contours to set map limits
  bb <- terra::ext(contours)
  # generate map
  check_map <- ggplot2::ggplot(data = contours) +
    tidyterra::geom_spatvector(data = contours, color = contour_colour) +
    tidyterra::geom_spatvector(data = channels, color = channel_colour) +
    ggspatial::annotation_north_arrow(style = north_arrow_fancy_orienteering, 
                                      location = "tr",
                                      pad_x = unit(4, "mm"), 
                                      pad_y = unit(6.5, "mm")) +
    ggspatial::annotation_scale() +
    coord_sf(xlim = c(bb[1], bb[2]), ylim = c(bb[3], bb[4]), 
             datum = terra::crs(channels)) +
    labs(title = main_label) +
    theme_bw()
  if (!is.null(outlet)) {
    check_map <- check_map +
      tidyterra::geom_spatvector(data = outlet, pch = 21, bg = pp_colour) +
      coord_sf(xlim = c(bb[1], bb[2]), ylim = c(bb[3], bb[4]), 
               datum = terra::crs(channels))
  }
  print(check_map)
  return(check_map)
} 
