---
title: "Getting Started with lakefetch"
output: rmarkdown::html_vignette
vignette: >
  %\VignetteIndexEntry{Getting Started with lakefetch}
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteEncoding{UTF-8}
---

```{r, include = FALSE}
knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>",
  eval = FALSE
)
```

## Introduction
The **lakefetch** package calculates fetch (open water distance) and wave exposure
metrics for lake sampling points. Fetch is an important physical parameter that
influences wave energy, sediment resuspension, and habitat characteristics.

## Installation

```{r install, eval = FALSE}
install.packages("lakefetch")

# Optional packages for extra features:
# install.packages("nhdplusTools")                      # NHD integration
# install.packages(c("shiny", "leaflet", "base64enc"))  # Interactive app
```

## Quick Start

### 1. Load your site data

```{r load-sites}
library(lakefetch)

# From CSV file
sites <- load_sites("my_lake_sites.csv")

# Or create manually
sites <- data.frame(
  Site = c("Site_A", "Site_B", "Site_C"),
  latitude = c(43.42, 43.43, 43.41),
  longitude = c(-73.69, -73.68, -73.70)
)
sites <- load_sites(sites)
```

Your CSV should have columns for site names and coordinates. Column names
starting with "lat" and "lon" are automatically detected.

### 2. Get lake boundary

```{r get-lake}
# Automatically download from OpenStreetMap
lake <- get_lake_boundary(sites)

# Or load from a local shapefile
lake <- get_lake_boundary(sites, file = "lake_boundary.shp")
```

### 3. Calculate fetch

```{r calculate}
results <- fetch_calculate(sites, lake)

# View results
head(results$results)
```

### 4. Visualize

```{r visualize}
# Map of sites
plot_fetch_map(results)

# Bar chart
plot_fetch_bars(results)

# Interactive app
fetch_app(results)
```

## Understanding the Results

The `fetch_calculate()` function returns a list containing:

- `results`: An sf object with one row per site, containing:
  - `fetch_0`, `fetch_5`, ..., `fetch_355`: Fetch distance in each direction (meters)
  - `fetch_mean`: Average fetch across all directions
  - `fetch_max`: Maximum fetch (longest open water distance)
  - `fetch_effective`: Mean of the three longest fetch values
  - `orbital_effective`: Estimated wave orbital velocity (m/s)
  - `exposure_category`: Classification as "Sheltered", "Moderate", or "Exposed"

- `lakes`: The lake polygon(s) used for calculation
- `angles`: The angles (in degrees) used for ray-casting

## Exposure Categories

Sites are classified based on effective fetch:

| Category | Effective Fetch | Typical Conditions |
|----------|-----------------|-------------------|
| Sheltered | < 2.5 km | Protected bays, minimal wave action |
| Moderate | 2.5 - 5 km | Some wave exposure, mixed conditions |
| Exposed | > 5 km | Open water, significant wave energy |

## Configuration Options

Customize the calculation parameters:

```{r options}
# View current options
lakefetch_options()

# Change options
lakefetch_options(
  buffer_distance_m = 20,      # GPS accuracy buffer
  angle_resolution_deg = 10,   # Direction resolution (degrees)
  max_fetch_m = 30000,         # Maximum fetch distance
  use_parallel = TRUE          # Parallel processing for multiple lakes
)

# Reset to defaults
lakefetch_reset_options()
```

## NHD Integration

If the `nhdplusTools` package is installed, lakefetch can add hydrological
context from the National Hydrography Dataset:
- Lake outlet and inlet locations
- Distance and direction to outlet/inlets from each site
- Connectivity classification (Headwater, Drainage, Terminal, Isolated)
- Outlet stream order
- Watershed area

```{r nhd}
# NHD context is added automatically if available
results <- fetch_calculate(sites, lake, add_context = TRUE)

# Check connectivity
table(results$results$connectivity_class)
```

## Working with Multiple Lakes

If your sites span multiple lakes, lakefetch handles this automatically:

```{r multi-lake}
# Sites are assigned to their containing lake polygon
sites_with_lakes <- assign_sites_to_lakes(lake$sites, lake$all_lakes)

# Check assignment
table(sites_with_lakes$lake_name)
```

## Exporting Results

```{r export}
# To CSV (without geometry)
write.csv(sf::st_drop_geometry(results$results),
          "fetch_results.csv", row.names = FALSE)

# To GeoPackage (with geometry)
sf::st_write(results$results, "fetch_results.gpkg")

# Export ray geometries for GIS
rays <- create_ray_geometries(results)
sf::st_write(rays, "fetch_rays.gpkg")
```
