library(tidygeocoder)
library(leaflet)
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
dane_celne <- data.frame(
  id = 1:4,
  start_kod = c("PL421010", "PL321010", "PL421030", "PL421030"),
  plan_border_kod = c("PL311030", "PL401060", "PL401060", "SE603340"),
  akt_border_kod = c("PL311070", "SK532100", "HU724000", "FI994900"),
  odbiorca_adres = c("Mińsk, Białoruś", "Kijów, Ukraina", "Czerniowce, Ukraina", "Oksfjordhamn, Norwegia")
)

kody_na_adresy <- c(
  "PL421010" = "Szczecin, ul. Żołnierska 45",       # OC Szczecin
  "PL321010" = "Gdynia, ul. Indyjska 13",        
  "PL421030" = "Szczecin, ul. Hryniewieckiego 6c",  # OC Szczecin (Łasztownia)
  "PL311030" = "Kuźnica, Polska",                   # OC Kuźnica (Drogowy)
  "PL311070" = "Bobrowniki, Polska",                # OC Bobrowniki
  "PL401060" = "Korczowa, Polska",                  # Przejście graniczne Korczowa
  "SK532100" = "Vyšné Nemecké, Słowacja",           # Przejście graniczne SK/UA
  "HU724000" = "Zahony, Węgry",                     # Przejście graniczne HU/UA
  "SE603340" = "Svinesund, Szwecja",                # Przejście graniczne SE/NO
  "FI994900" = "Karesuvanto, Finlandia"             # Przejście graniczne FI/NO 
)


dane_celne$start_adres <- kody_na_adresy[dane_celne$start_kod]
dane_celne$plan_border_adres <- kody_na_adresy[dane_celne$plan_border_kod]
dane_celne$akt_border_adres <- kody_na_adresy[dane_celne$akt_border_kod]

wszystkie_adresy <- unique(c(dane_celne$start_adres, 
                             dane_celne$plan_border_adres, 
                             dane_celne$akt_border_adres, 
                             dane_celne$odbiorca_adres))

adresy_df <- data.frame(adres = wszystkie_adresy)

adresy_wsp <- tidygeocoder::geocode(adresy_df, address = adres, method = "osm")
## Passing 14 addresses to the Nominatim single address geocoder
## Query completed in: 14.1 seconds
adresy_wsp$lat[adresy_wsp$adres == "Oksfjordhamn, Norwegia" & is.na(adresy_wsp$lat)] <- 69.908
adresy_wsp$long[adresy_wsp$adres == "Oksfjordhamn, Norwegia" & is.na(adresy_wsp$long)] <- 21.334
adresy_wsp$lat[adresy_wsp$adres == "Kilpisjärvi, Finlandia" & is.na(adresy_wsp$lat)] <- 69.049
adresy_wsp$long[adresy_wsp$adres == "Kilpisjärvi, Finlandia" & is.na(adresy_wsp$long)] <- 20.798

dane_geo <- dane_celne %>%
  left_join(adresy_wsp, by = c("start_adres" = "adres")) %>% rename(start_lat = lat, start_long = long) %>%
  left_join(adresy_wsp, by = c("plan_border_adres" = "adres")) %>% rename(plan_border_lat = lat, plan_border_long = long) %>%
  left_join(adresy_wsp, by = c("akt_border_adres" = "adres")) %>% rename(akt_border_lat = lat, akt_border_long = long) %>%
  left_join(adresy_wsp, by = c("odbiorca_adres" = "adres")) %>% rename(end_lat = lat, end_long = long)

# Przypadek 1: Szczecin -> Białoruś (Zmiana: Kuźnica na Bobrowniki)
case1 <- dane_geo[1, ]
# Zmiana przejścia z Kuźnicy na Bobrowniki (bardziej na południe).Prawdopodobnie z powodu korków w Kuźnicy lub awarii systemu odpraw.

leaflet() |> addProviderTiles("CartoDB.Positron") |>
  addCircleMarkers(lng = c(case1$start_long, case1$plan_border_long, case1$akt_border_long, case1$end_long),
                   lat = c(case1$start_lat, case1$plan_border_lat, case1$akt_border_lat, case1$end_lat), radius = 5, color = "black") |>
  addPolylines(lng = c(case1$start_long, case1$plan_border_long, case1$end_long), lat = c(case1$start_lat, case1$plan_border_lat, case1$end_lat),
               color = "blue", weight = 2, dashArray = "5, 5") |> # Planowana
  addPolylines(lng = c(case1$start_long, case1$akt_border_long, case1$end_long), lat = c(case1$start_lat, case1$akt_border_lat, case1$end_lat),
               color = "red", weight = 3) # Faktyczna
## Warning in validateCoords(lng, lat, funcName): Data contains 1 rows with either
## missing or invalid lat/lon values and will be ignored
# Przypadek 2: Gdynia -> Ukraina (Kijów)
case2 <- dane_geo[2, ]
#Towar ruszył z Gdyni. Zamiast jechać najkrótszą drogą przez Korczową (PL/UA), kierowca nadrobił drogi przez Słowację (Vyšné Nemecké), omijając zatory na granicy polsko-ukraińskiej.

leaflet() |> addProviderTiles("CartoDB.Positron") |>
  fitBounds(min(case2$start_long, case2$akt_border_long), min(case2$start_lat, case2$akt_border_lat), max(case2$end_long), max(case2$end_lat)) |>
  addCircleMarkers(lng = c(case2$start_long, case2$plan_border_long, case2$akt_border_long, case2$end_long),
                   lat = c(case2$start_lat, case2$plan_border_lat, case2$akt_border_lat, case2$end_lat), radius = 5, color = "black") |>
  addPolylines(lng = c(case2$start_long, case2$plan_border_long, case2$end_long), lat = c(case2$start_lat, case2$plan_border_lat, case2$end_lat),
               color = "blue", weight = 2, dashArray = "5, 5") |>
  addPolylines(lng = c(case2$start_long, case2$akt_border_long, case2$end_long), lat = c(case2$start_lat, case2$akt_border_lat, case2$end_lat),
               color = "red", weight = 3)
## Warning in validateCoords(lng, lat, funcName): Data contains 1 rows with either
## missing or invalid lat/lon values and will be ignored
# Przypadek 3: Szczecin -> Ukraina (Czerniowce)
case3 <- dane_geo[3, ]
# Ogromny objazd przez Węgry (Zahony). Towar zamiast wjechać do UA w Korczowej, pojechał znacznie bardziej na południe, wjeżdżając "od dołu" prawdopodobnie ze względów bezpieczeństwa.

leaflet() |> addProviderTiles("CartoDB.Positron") |>
  addCircleMarkers(lng = c(case3$start_long, case3$plan_border_long, case3$akt_border_long, case3$end_long),
                   lat = c(case3$start_lat, case3$plan_border_lat, case3$akt_border_lat, case3$end_lat), radius = 5, color = "black") |>
  addPolylines(lng = c(case3$start_long, case3$plan_border_long, case3$end_long), lat = c(case3$start_lat, case3$plan_border_lat, case3$end_lat),
               color = "blue", weight = 2, dashArray = "5, 5") |>
  addPolylines(lng = c(case3$start_long, case3$akt_border_long, case3$end_long), lat = c(case3$start_lat, case3$akt_border_lat, case3$end_lat),
               color = "red", weight = 3)
## Warning in validateCoords(lng, lat, funcName): Data contains 1 rows with either
## missing or invalid lat/lon values and will be ignored
# Przypadek 4: Szczecin -> Norwegia (Oksfjordhamn)
case4 <- dane_geo[4, ]
#Zamiast wjazdu do Norwegii na południu (Svinesund) i jazdy trudną, górzystą drogą przez cały kraj, wybrano szybszy tranzyt przez Szwecję i Finlandię, z wjazdem do Norwegii dopiero na samej północy w Kilpisjärvi.

leaflet() |> addProviderTiles("CartoDB.Positron") |>
  addCircleMarkers(lng = c(case4$start_long, case4$plan_border_long, case4$akt_border_long, case4$end_long),
                   lat = c(case4$start_lat, case4$plan_border_lat, case4$akt_border_lat, case4$end_lat), radius = 5, color = "black") |>
  addPolylines(lng = c(case4$start_long, case4$plan_border_long, case4$end_long), lat = c(case4$start_lat, case4$plan_border_lat, case4$end_lat),
               color = "blue", weight = 2, dashArray = "5, 5") |>
  addPolylines(lng = c(case4$start_long, case4$akt_border_long, case4$end_long), lat = c(case4$start_lat, case4$akt_border_lat, case4$end_lat),
               color = "red", weight = 3)
## Warning in validateCoords(lng, lat, funcName): Data contains 1 rows with either
## missing or invalid lat/lon values and will be ignored