{-# OPTIONS_GHC -Wall #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE TemplateHaskell #-}

module Data.Aviation.Casr.Logbook.Types.AircraftFlight(
  AircraftFlight(..)
, HasAircraftFlight(..)
, icusonlyflight
, noif_icusonlyflight
, dualonlyflight
, noif_dualonlyflight
, commandonlyflight
, noif_commandonlyflight
, instructionflight
, noif_instructionflight
, aeronauticalHours
) where

import Control.Category((.))
import Control.Lens ( view, makeClassy )
import Data.Aviation.Casr.Logbook.Types.Aircraft(Aircraft, HasAircraft(aircraft))
import Data.Aviation.Casr.Logbook.Types.Command
    ( Command(InCommandInstructing, InCommand, Dual, ICUS) )
import Data.Aviation.Casr.Logbook.Types.DayNight
    ( DayNight, HasDayNight(dayNight) )
import Data.Aviation.Casr.Logbook.Types.FlightPath(FlightPath, HasFlightPath(flightPath))
import Data.Aviation.Casr.Logbook.Types.Instruction ( Instruction )
import Data.Aviation.Casr.Logbook.Types.Aviator(Aviator)
import Data.Aviation.Casr.Logbook.Types.TimeAmount
    ( TimeAmount, zerotimeamount )
import Data.Eq(Eq)
import Data.Ord(Ord)
import Data.String(String)
import Prelude(Show)

data AircraftFlight =
  AircraftFlight {
    AircraftFlight -> String
_aircraftflightname :: String
  , AircraftFlight -> Aircraft
_flightaircraft :: Aircraft
  , AircraftFlight -> Command
_command :: Command
  , AircraftFlight -> DayNight
_daynight :: DayNight
  , AircraftFlight -> FlightPath
_flightpath :: FlightPath
  , AircraftFlight -> [Aviator]
_flightothercrew :: [Aviator]
  , AircraftFlight -> TimeAmount
_instrumentflightTime :: TimeAmount
  } deriving (AircraftFlight -> AircraftFlight -> Bool
(AircraftFlight -> AircraftFlight -> Bool)
-> (AircraftFlight -> AircraftFlight -> Bool) -> Eq AircraftFlight
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: AircraftFlight -> AircraftFlight -> Bool
== :: AircraftFlight -> AircraftFlight -> Bool
$c/= :: AircraftFlight -> AircraftFlight -> Bool
/= :: AircraftFlight -> AircraftFlight -> Bool
Eq, Eq AircraftFlight
Eq AircraftFlight =>
(AircraftFlight -> AircraftFlight -> Ordering)
-> (AircraftFlight -> AircraftFlight -> Bool)
-> (AircraftFlight -> AircraftFlight -> Bool)
-> (AircraftFlight -> AircraftFlight -> Bool)
-> (AircraftFlight -> AircraftFlight -> Bool)
-> (AircraftFlight -> AircraftFlight -> AircraftFlight)
-> (AircraftFlight -> AircraftFlight -> AircraftFlight)
-> Ord AircraftFlight
AircraftFlight -> AircraftFlight -> Bool
AircraftFlight -> AircraftFlight -> Ordering
AircraftFlight -> AircraftFlight -> AircraftFlight
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: AircraftFlight -> AircraftFlight -> Ordering
compare :: AircraftFlight -> AircraftFlight -> Ordering
$c< :: AircraftFlight -> AircraftFlight -> Bool
< :: AircraftFlight -> AircraftFlight -> Bool
$c<= :: AircraftFlight -> AircraftFlight -> Bool
<= :: AircraftFlight -> AircraftFlight -> Bool
$c> :: AircraftFlight -> AircraftFlight -> Bool
> :: AircraftFlight -> AircraftFlight -> Bool
$c>= :: AircraftFlight -> AircraftFlight -> Bool
>= :: AircraftFlight -> AircraftFlight -> Bool
$cmax :: AircraftFlight -> AircraftFlight -> AircraftFlight
max :: AircraftFlight -> AircraftFlight -> AircraftFlight
$cmin :: AircraftFlight -> AircraftFlight -> AircraftFlight
min :: AircraftFlight -> AircraftFlight -> AircraftFlight
Ord, Int -> AircraftFlight -> ShowS
[AircraftFlight] -> ShowS
AircraftFlight -> String
(Int -> AircraftFlight -> ShowS)
-> (AircraftFlight -> String)
-> ([AircraftFlight] -> ShowS)
-> Show AircraftFlight
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> AircraftFlight -> ShowS
showsPrec :: Int -> AircraftFlight -> ShowS
$cshow :: AircraftFlight -> String
show :: AircraftFlight -> String
$cshowList :: [AircraftFlight] -> ShowS
showList :: [AircraftFlight] -> ShowS
Show)

makeClassy ''AircraftFlight

instance HasAircraft AircraftFlight where
  aircraft :: Lens' AircraftFlight Aircraft
aircraft =
    (Aircraft -> f Aircraft) -> AircraftFlight -> f AircraftFlight
forall c. HasAircraftFlight c => Lens' c Aircraft
Lens' AircraftFlight Aircraft
flightaircraft ((Aircraft -> f Aircraft) -> AircraftFlight -> f AircraftFlight)
-> ((Aircraft -> f Aircraft) -> Aircraft -> f Aircraft)
-> (Aircraft -> f Aircraft)
-> AircraftFlight
-> f AircraftFlight
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. (Aircraft -> f Aircraft) -> Aircraft -> f Aircraft
forall c. HasAircraft c => Lens' c Aircraft
Lens' Aircraft Aircraft
aircraft

instance HasDayNight AircraftFlight where
  dayNight :: Lens' AircraftFlight DayNight
dayNight =
    (DayNight -> f DayNight) -> AircraftFlight -> f AircraftFlight
forall c. HasAircraftFlight c => Lens' c DayNight
Lens' AircraftFlight DayNight
daynight ((DayNight -> f DayNight) -> AircraftFlight -> f AircraftFlight)
-> ((DayNight -> f DayNight) -> DayNight -> f DayNight)
-> (DayNight -> f DayNight)
-> AircraftFlight
-> f AircraftFlight
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. (DayNight -> f DayNight) -> DayNight -> f DayNight
forall c. HasDayNight c => Lens' c DayNight
Lens' DayNight DayNight
dayNight

instance HasFlightPath AircraftFlight where
  flightPath :: Lens' AircraftFlight FlightPath
flightPath =
    (FlightPath -> f FlightPath) -> AircraftFlight -> f AircraftFlight
forall c. HasAircraftFlight c => Lens' c FlightPath
Lens' AircraftFlight FlightPath
flightpath ((FlightPath -> f FlightPath)
 -> AircraftFlight -> f AircraftFlight)
-> ((FlightPath -> f FlightPath) -> FlightPath -> f FlightPath)
-> (FlightPath -> f FlightPath)
-> AircraftFlight
-> f AircraftFlight
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. (FlightPath -> f FlightPath) -> FlightPath -> f FlightPath
forall c. HasFlightPath c => Lens' c FlightPath
Lens' FlightPath FlightPath
flightPath

icusonlyflight ::
  String
  -> Aircraft
  -> Aviator
  -> DayNight
  -> FlightPath
  -> TimeAmount
  -> AircraftFlight
icusonlyflight :: String
-> Aircraft
-> Aviator
-> DayNight
-> FlightPath
-> TimeAmount
-> AircraftFlight
icusonlyflight String
n Aircraft
a Aviator
v DayNight
t FlightPath
p TimeAmount
i =
  String
-> Aircraft
-> Command
-> DayNight
-> FlightPath
-> [Aviator]
-> TimeAmount
-> AircraftFlight
AircraftFlight
    String
n
    Aircraft
a
    (Aviator -> Command
ICUS Aviator
v)
    DayNight
t
    FlightPath
p
    []
    TimeAmount
i

noif_icusonlyflight ::
  String
  -> Aircraft
  -> Aviator
  -> DayNight
  -> FlightPath
  -> AircraftFlight
noif_icusonlyflight :: String
-> Aircraft -> Aviator -> DayNight -> FlightPath -> AircraftFlight
noif_icusonlyflight String
n Aircraft
a Aviator
v DayNight
t FlightPath
p =
  String
-> Aircraft
-> Aviator
-> DayNight
-> FlightPath
-> TimeAmount
-> AircraftFlight
icusonlyflight
    String
n
    Aircraft
a
    Aviator
v
    DayNight
t
    FlightPath
p
    TimeAmount
zerotimeamount

dualonlyflight ::
  String
  -> Aircraft
  -> Aviator
  -> DayNight
  -> FlightPath
  -> TimeAmount
  -> AircraftFlight
dualonlyflight :: String
-> Aircraft
-> Aviator
-> DayNight
-> FlightPath
-> TimeAmount
-> AircraftFlight
dualonlyflight String
n Aircraft
a Aviator
v DayNight
t FlightPath
p TimeAmount
i =
  String
-> Aircraft
-> Command
-> DayNight
-> FlightPath
-> [Aviator]
-> TimeAmount
-> AircraftFlight
AircraftFlight
    String
n
    Aircraft
a
    (Aviator -> Command
Dual Aviator
v)
    DayNight
t
    FlightPath
p
    []
    TimeAmount
i

noif_dualonlyflight ::
  String
  -> Aircraft
  -> Aviator
  -> DayNight
  -> FlightPath
  -> AircraftFlight
noif_dualonlyflight :: String
-> Aircraft -> Aviator -> DayNight -> FlightPath -> AircraftFlight
noif_dualonlyflight String
n Aircraft
a Aviator
v DayNight
t FlightPath
p =
  String
-> Aircraft
-> Aviator
-> DayNight
-> FlightPath
-> TimeAmount
-> AircraftFlight
dualonlyflight
    String
n
    Aircraft
a
    Aviator
v
    DayNight
t
    FlightPath
p
    TimeAmount
zerotimeamount

commandonlyflight ::
  String
  -> Aircraft
  -> DayNight
  -> FlightPath
  -> TimeAmount
  -> AircraftFlight
commandonlyflight :: String
-> Aircraft
-> DayNight
-> FlightPath
-> TimeAmount
-> AircraftFlight
commandonlyflight String
n Aircraft
a DayNight
t FlightPath
p TimeAmount
i =
  String
-> Aircraft
-> Command
-> DayNight
-> FlightPath
-> [Aviator]
-> TimeAmount
-> AircraftFlight
AircraftFlight
    String
n
    Aircraft
a
    Command
InCommand
    DayNight
t
    FlightPath
p
    []
    TimeAmount
i

noif_commandonlyflight ::
  String
  -> Aircraft
  -> DayNight
  -> FlightPath
  -> AircraftFlight
noif_commandonlyflight :: String -> Aircraft -> DayNight -> FlightPath -> AircraftFlight
noif_commandonlyflight String
n Aircraft
a DayNight
t FlightPath
p =
  String
-> Aircraft
-> DayNight
-> FlightPath
-> TimeAmount
-> AircraftFlight
commandonlyflight
    String
n
    Aircraft
a
    DayNight
t
    FlightPath
p
    TimeAmount
zerotimeamount

instructionflight ::
  String
  -> Aircraft
  -> Instruction
  -> DayNight
  -> FlightPath
  -> TimeAmount
  -> AircraftFlight
instructionflight :: String
-> Aircraft
-> Instruction
-> DayNight
-> FlightPath
-> TimeAmount
-> AircraftFlight
instructionflight String
n Aircraft
a Instruction
s DayNight
t FlightPath
p TimeAmount
i =
  String
-> Aircraft
-> Command
-> DayNight
-> FlightPath
-> [Aviator]
-> TimeAmount
-> AircraftFlight
AircraftFlight
    String
n
    Aircraft
a
    (Instruction -> Command
InCommandInstructing Instruction
s)
    DayNight
t
    FlightPath
p
    []
    TimeAmount
i

noif_instructionflight ::
  String
  -> Aircraft
  -> Instruction
  -> DayNight
  -> FlightPath
  -> AircraftFlight
noif_instructionflight :: String
-> Aircraft
-> Instruction
-> DayNight
-> FlightPath
-> AircraftFlight
noif_instructionflight String
n Aircraft
a Instruction
s DayNight
t FlightPath
p =
  String
-> Aircraft
-> Command
-> DayNight
-> FlightPath
-> [Aviator]
-> TimeAmount
-> AircraftFlight
AircraftFlight
    String
n
    Aircraft
a
    (Instruction -> Command
InCommandInstructing Instruction
s)
    DayNight
t
    FlightPath
p
    []
    TimeAmount
zerotimeamount

aeronauticalHours ::
  AircraftFlight
  -> DayNight
aeronauticalHours :: AircraftFlight -> DayNight
aeronauticalHours AircraftFlight
fl =
  Getting DayNight AircraftFlight DayNight
-> AircraftFlight -> DayNight
forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
view Getting DayNight AircraftFlight DayNight
forall c. HasDayNight c => Lens' c DayNight
Lens' AircraftFlight DayNight
dayNight AircraftFlight
fl