content: module Waldo.CityLoc where
  
  import Control.Monad.Reader
  import Data.Geo.Coord
  import Data.Geo.Sphere
  import Data.Geo.Haversine
  
  import Waldo.Stalk
  import Waldo.Story
  
  data CityData = CityData {
      cityLoc :: Coord
    , cityInfluenceKm :: Double
    }
  
  mkCity :: Coord -> Double -> CityData
  mkCity l i = CityData l i
  
  closeTo :: CityData -> StoryGuard
  closeTo c =
    asks pdLatLon >>= guard . (maybe False (\latlon ->
                                             let kmDist = (haversine earthMean (cityLoc c) latlon)/1000
                                             in kmDist < (cityInfluenceKm c)))
  
  atlanta, belfast, boston, brisbane, cambridge, chicago, christchurch, cnu, dallas, detroit, downtownNYC, greenBay, halifax, houston, jerusalem, lakeChamplain, lakeErie, lakeMead, lakeMichigan, lasVegas, london, losAngeles, melbourne, miami, montreal, nyc, ottawa, paris, philadelphia, richmond, rioDeJaneiro, riverside, sacramento, sanAntonio, sanDiego, sanFran, scotland, seattle, sendai, sydney, tampa, telAviv, tokyo, toronto, vaBeach :: CityData
  
  atlanta      = mkCity (( 33.755000) !.! (- 84.390000)) 20
  belfast      = mkCity (( 54.600000) !.! (-  5.916700)) 6
  boston       = mkCity (( 42.357778) !.! (- 71.061667)) 4
  brisbane     = mkCity ((-27.466700) !.! ( 153.033300)) 180
  cambridge    = mkCity (( 42.373611) !.! (- 71.110556)) 40
  chicago      = mkCity (( 41.881944) !.! (- 87.627778)) 40
  christchurch = mkCity ((-43.500000) !.! ( 172.600000)) 13
  cnu          = mkCity (( 37.063800) !.! (- 76.494200)) 10
  dallas       = mkCity (( 32.782778) !.! (- 96.803889)) 73
  detroit      = mkCity (( 42.331389) !.! (- 83.045833)) 50
  greenBay     = mkCity (( 44.513333) !.! (- 88.015833)) 180
  halifax      = mkCity (( 44.654444) !.! (- 63.599167)) 17
  houston      = mkCity (( 29.762778) !.! (- 95.383056)) 20
  jerusalem    = mkCity (( 31.783300) !.! (  35.216700)) 4
  lakeChamplain= mkCity (( 44.533333) !.! (- 73.333333)) 58
  lakeErie     = mkCity (( 42.200000) !.! (- 81.200000)) 140
  lakeMead     = mkCity (( 36.250000) !.! (-114.390000)) 50
  lakeMichigan = mkCity (( 44.000000) !.! (- 87.000000)) 130
  lasVegas     = mkCity (( 36.175000) !.! (-115.136389)) 20
  london       = mkCity (( 51.517100) !.! (   0.106200)) 30
  losAngeles   = mkCity (( 34.050000) !.! (-118.250000)) 65
  melbourne    = mkCity ((-37.783300) !.! ( 144.966700)) 40
  miami        = mkCity (( 25.787778) !.! (- 80.224167)) 30
  montreal     = mkCity (( 45.500000) !.! (- 73.666667)) 45
  downtownNYC  = mkCity (( 40.664167) !.! (- 73.938611)) 20
  nyc          = mkCity (( 40.664167) !.! (- 73.938611)) 20
  ottawa       = mkCity (( 45.420833) !.! (- 75.690000)) 50
  paris        = mkCity (( 48.874200) !.! (   2.347000)) 25
  philadelphia = mkCity (( 39.953333) !.! (- 75.170000)) 20
  richmond     = mkCity (( 37.540972) !.! (- 77.432889)) 40
  rioDeJaneiro = mkCity ((-22.908300) !.! (- 43.243600)) 70
  riverside    = mkCity (( 33.948056) !.! (-117.396111)) 15
  sacramento   = mkCity (( 38.555556) !.! (-121.468889)) 45
  sanAntonio   = mkCity (( 29.416667) !.! (- 98.500000)) 23
  sanDiego     = mkCity (( 32.715000) !.! (-117.162500)) 60
  sanFran      = mkCity (( 37.779300) !.! (-122.419200)) 10
  scotland     = mkCity (( 57.100000) !.! (-  4.000000)) 250
  seattle      = mkCity (( 47.609722) !.! (-122.333056)) 45
  sendai       = mkCity (( 31.816700) !.! ( 130.300600)) 35
  sydney       = mkCity ((-33.868300) !.! ( 151.208600)) 60
  tampa        = mkCity (( 27.947222) !.! (- 82.458611)) 42
  telAviv      = mkCity (( 32.083300) !.! (  34.800000)) 10
  tokyo        = mkCity (( 35.683300) !.! ( 139.766700)) 50
  toronto      = mkCity (( 43.716589) !.! (- 79.340686)) 30
  vaBeach      = mkCity (( 36.850600) !.! (- 75.977900)) 37
  