{-|
Module      : SimFin.Types.Ratios
Description : Ratios derived from a business' financial statements.
Copyright   : (c) Owen Shepherd, 2022
License     : MIT
Maintainer  : owen@owen.cafe
-}

{-# LANGUAGE DeriveFunctor #-}
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE OverloadedStrings #-}

module SimFin.Types.Ratios
  ( RatiosRow(..)
  ) where

import Data.Aeson

import SimFin.Types.StringFrac

-- | Record modelling the extra data returned by calling the share price API endpoint with the "&ratios"
-- query parameter. See the [SimFin docs](https://simfin.com/api/v2/documentation/#tag/Company/paths/~1companies~1prices/get).

data RatiosRow a
  = RatiosRow
  { RatiosRow a -> Integer
marketCap :: Integer
  , RatiosRow a -> Maybe a
priceToEarningsRatioQuarterly :: Maybe a
  , RatiosRow a -> Maybe a
priceToEarningsRatioTTM :: Maybe a
  , RatiosRow a -> Maybe a
priceToSalesRatioQuarterly :: Maybe a
  , RatiosRow a -> Maybe a
priceToSalesRatioTTM :: Maybe a
  , RatiosRow a -> Maybe a
priceToBookValueTTM :: Maybe a
  , RatiosRow a -> Maybe a
priceToFreeCashFlowQuarterly :: Maybe a
  , RatiosRow a -> Maybe a
priceToFreeCashFlowTTM :: Maybe a
  , RatiosRow a -> Maybe a
enterpriseValueTTM :: Maybe a
  , RatiosRow a -> Maybe a
eVEBITDATTM :: Maybe a
  , RatiosRow a -> Maybe a
eVSalesTTM :: Maybe a
  , RatiosRow a -> Maybe a
eVFCFTTM :: Maybe a
  , RatiosRow a -> Maybe a
bookToMarketValueTTM :: Maybe a
  , RatiosRow a -> Maybe a
operatingIncomeEVTTM :: Maybe a
  } deriving (a -> RatiosRow b -> RatiosRow a
(a -> b) -> RatiosRow a -> RatiosRow b
(forall a b. (a -> b) -> RatiosRow a -> RatiosRow b)
-> (forall a b. a -> RatiosRow b -> RatiosRow a)
-> Functor RatiosRow
forall a b. a -> RatiosRow b -> RatiosRow a
forall a b. (a -> b) -> RatiosRow a -> RatiosRow b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: a -> RatiosRow b -> RatiosRow a
$c<$ :: forall a b. a -> RatiosRow b -> RatiosRow a
fmap :: (a -> b) -> RatiosRow a -> RatiosRow b
$cfmap :: forall a b. (a -> b) -> RatiosRow a -> RatiosRow b
Functor, Int -> RatiosRow a -> ShowS
[RatiosRow a] -> ShowS
RatiosRow a -> String
(Int -> RatiosRow a -> ShowS)
-> (RatiosRow a -> String)
-> ([RatiosRow a] -> ShowS)
-> Show (RatiosRow a)
forall a. Show a => Int -> RatiosRow a -> ShowS
forall a. Show a => [RatiosRow a] -> ShowS
forall a. Show a => RatiosRow a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [RatiosRow a] -> ShowS
$cshowList :: forall a. Show a => [RatiosRow a] -> ShowS
show :: RatiosRow a -> String
$cshow :: forall a. Show a => RatiosRow a -> String
showsPrec :: Int -> RatiosRow a -> ShowS
$cshowsPrec :: forall a. Show a => Int -> RatiosRow a -> ShowS
Show)

instance (Read a, RealFrac a) => FromJSON (RatiosRow a) where
  parseJSON :: Value -> Parser (RatiosRow a)
parseJSON = String
-> (Object -> Parser (RatiosRow a))
-> Value
-> Parser (RatiosRow a)
forall a. String -> (Object -> Parser a) -> Value -> Parser a
withObject String
"RatiosRow" ((Object -> Parser (RatiosRow a)) -> Value -> Parser (RatiosRow a))
-> (Object -> Parser (RatiosRow a))
-> Value
-> Parser (RatiosRow a)
forall a b. (a -> b) -> a -> b
$ \Object
v -> (RatiosRow (StringFrac a) -> RatiosRow a)
-> Parser (RatiosRow (StringFrac a)) -> Parser (RatiosRow a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((StringFrac a -> a) -> RatiosRow (StringFrac a) -> RatiosRow a
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap StringFrac a -> a
forall a. StringFrac a -> a
unStringFrac) (Parser (RatiosRow (StringFrac a)) -> Parser (RatiosRow a))
-> Parser (RatiosRow (StringFrac a)) -> Parser (RatiosRow a)
forall a b. (a -> b) -> a -> b
$ Integer
-> Maybe (StringFrac a)
-> Maybe (StringFrac a)
-> Maybe (StringFrac a)
-> Maybe (StringFrac a)
-> Maybe (StringFrac a)
-> Maybe (StringFrac a)
-> Maybe (StringFrac a)
-> Maybe (StringFrac a)
-> Maybe (StringFrac a)
-> Maybe (StringFrac a)
-> Maybe (StringFrac a)
-> Maybe (StringFrac a)
-> Maybe (StringFrac a)
-> RatiosRow (StringFrac a)
forall a.
Integer
-> Maybe a
-> Maybe a
-> Maybe a
-> Maybe a
-> Maybe a
-> Maybe a
-> Maybe a
-> Maybe a
-> Maybe a
-> Maybe a
-> Maybe a
-> Maybe a
-> Maybe a
-> RatiosRow a
RatiosRow
    (Integer
 -> Maybe (StringFrac a)
 -> Maybe (StringFrac a)
 -> Maybe (StringFrac a)
 -> Maybe (StringFrac a)
 -> Maybe (StringFrac a)
 -> Maybe (StringFrac a)
 -> Maybe (StringFrac a)
 -> Maybe (StringFrac a)
 -> Maybe (StringFrac a)
 -> Maybe (StringFrac a)
 -> Maybe (StringFrac a)
 -> Maybe (StringFrac a)
 -> Maybe (StringFrac a)
 -> RatiosRow (StringFrac a))
-> Parser Integer
-> Parser
     (Maybe (StringFrac a)
      -> Maybe (StringFrac a)
      -> Maybe (StringFrac a)
      -> Maybe (StringFrac a)
      -> Maybe (StringFrac a)
      -> Maybe (StringFrac a)
      -> Maybe (StringFrac a)
      -> Maybe (StringFrac a)
      -> Maybe (StringFrac a)
      -> Maybe (StringFrac a)
      -> Maybe (StringFrac a)
      -> Maybe (StringFrac a)
      -> Maybe (StringFrac a)
      -> RatiosRow (StringFrac a))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
v Object -> Text -> Parser Integer
forall a. FromJSON a => Object -> Text -> Parser a
.: Text
"Market-Cap"
    Parser
  (Maybe (StringFrac a)
   -> Maybe (StringFrac a)
   -> Maybe (StringFrac a)
   -> Maybe (StringFrac a)
   -> Maybe (StringFrac a)
   -> Maybe (StringFrac a)
   -> Maybe (StringFrac a)
   -> Maybe (StringFrac a)
   -> Maybe (StringFrac a)
   -> Maybe (StringFrac a)
   -> Maybe (StringFrac a)
   -> Maybe (StringFrac a)
   -> Maybe (StringFrac a)
   -> RatiosRow (StringFrac a))
-> Parser (Maybe (StringFrac a))
-> Parser
     (Maybe (StringFrac a)
      -> Maybe (StringFrac a)
      -> Maybe (StringFrac a)
      -> Maybe (StringFrac a)
      -> Maybe (StringFrac a)
      -> Maybe (StringFrac a)
      -> Maybe (StringFrac a)
      -> Maybe (StringFrac a)
      -> Maybe (StringFrac a)
      -> Maybe (StringFrac a)
      -> Maybe (StringFrac a)
      -> Maybe (StringFrac a)
      -> RatiosRow (StringFrac a))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v Object -> Text -> Parser (Maybe (StringFrac a))
forall a. FromJSON a => Object -> Text -> Parser a
.: Text
"Price to Earnings Ratio (quarterly)"
    Parser
  (Maybe (StringFrac a)
   -> Maybe (StringFrac a)
   -> Maybe (StringFrac a)
   -> Maybe (StringFrac a)
   -> Maybe (StringFrac a)
   -> Maybe (StringFrac a)
   -> Maybe (StringFrac a)
   -> Maybe (StringFrac a)
   -> Maybe (StringFrac a)
   -> Maybe (StringFrac a)
   -> Maybe (StringFrac a)
   -> Maybe (StringFrac a)
   -> RatiosRow (StringFrac a))
-> Parser (Maybe (StringFrac a))
-> Parser
     (Maybe (StringFrac a)
      -> Maybe (StringFrac a)
      -> Maybe (StringFrac a)
      -> Maybe (StringFrac a)
      -> Maybe (StringFrac a)
      -> Maybe (StringFrac a)
      -> Maybe (StringFrac a)
      -> Maybe (StringFrac a)
      -> Maybe (StringFrac a)
      -> Maybe (StringFrac a)
      -> Maybe (StringFrac a)
      -> RatiosRow (StringFrac a))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v Object -> Text -> Parser (Maybe (StringFrac a))
forall a. FromJSON a => Object -> Text -> Parser a
.: Text
"Price to Earnings Ratio (ttm)"
    Parser
  (Maybe (StringFrac a)
   -> Maybe (StringFrac a)
   -> Maybe (StringFrac a)
   -> Maybe (StringFrac a)
   -> Maybe (StringFrac a)
   -> Maybe (StringFrac a)
   -> Maybe (StringFrac a)
   -> Maybe (StringFrac a)
   -> Maybe (StringFrac a)
   -> Maybe (StringFrac a)
   -> Maybe (StringFrac a)
   -> RatiosRow (StringFrac a))
-> Parser (Maybe (StringFrac a))
-> Parser
     (Maybe (StringFrac a)
      -> Maybe (StringFrac a)
      -> Maybe (StringFrac a)
      -> Maybe (StringFrac a)
      -> Maybe (StringFrac a)
      -> Maybe (StringFrac a)
      -> Maybe (StringFrac a)
      -> Maybe (StringFrac a)
      -> Maybe (StringFrac a)
      -> Maybe (StringFrac a)
      -> RatiosRow (StringFrac a))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v Object -> Text -> Parser (Maybe (StringFrac a))
forall a. FromJSON a => Object -> Text -> Parser a
.: Text
"Price to Sales Ratio (quarterly)"
    Parser
  (Maybe (StringFrac a)
   -> Maybe (StringFrac a)
   -> Maybe (StringFrac a)
   -> Maybe (StringFrac a)
   -> Maybe (StringFrac a)
   -> Maybe (StringFrac a)
   -> Maybe (StringFrac a)
   -> Maybe (StringFrac a)
   -> Maybe (StringFrac a)
   -> Maybe (StringFrac a)
   -> RatiosRow (StringFrac a))
-> Parser (Maybe (StringFrac a))
-> Parser
     (Maybe (StringFrac a)
      -> Maybe (StringFrac a)
      -> Maybe (StringFrac a)
      -> Maybe (StringFrac a)
      -> Maybe (StringFrac a)
      -> Maybe (StringFrac a)
      -> Maybe (StringFrac a)
      -> Maybe (StringFrac a)
      -> Maybe (StringFrac a)
      -> RatiosRow (StringFrac a))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v Object -> Text -> Parser (Maybe (StringFrac a))
forall a. FromJSON a => Object -> Text -> Parser a
.: Text
"Price to Sales Ratio (ttm)"
    Parser
  (Maybe (StringFrac a)
   -> Maybe (StringFrac a)
   -> Maybe (StringFrac a)
   -> Maybe (StringFrac a)
   -> Maybe (StringFrac a)
   -> Maybe (StringFrac a)
   -> Maybe (StringFrac a)
   -> Maybe (StringFrac a)
   -> Maybe (StringFrac a)
   -> RatiosRow (StringFrac a))
-> Parser (Maybe (StringFrac a))
-> Parser
     (Maybe (StringFrac a)
      -> Maybe (StringFrac a)
      -> Maybe (StringFrac a)
      -> Maybe (StringFrac a)
      -> Maybe (StringFrac a)
      -> Maybe (StringFrac a)
      -> Maybe (StringFrac a)
      -> Maybe (StringFrac a)
      -> RatiosRow (StringFrac a))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v Object -> Text -> Parser (Maybe (StringFrac a))
forall a. FromJSON a => Object -> Text -> Parser a
.: Text
"Price to Book Value (ttm)"
    Parser
  (Maybe (StringFrac a)
   -> Maybe (StringFrac a)
   -> Maybe (StringFrac a)
   -> Maybe (StringFrac a)
   -> Maybe (StringFrac a)
   -> Maybe (StringFrac a)
   -> Maybe (StringFrac a)
   -> Maybe (StringFrac a)
   -> RatiosRow (StringFrac a))
-> Parser (Maybe (StringFrac a))
-> Parser
     (Maybe (StringFrac a)
      -> Maybe (StringFrac a)
      -> Maybe (StringFrac a)
      -> Maybe (StringFrac a)
      -> Maybe (StringFrac a)
      -> Maybe (StringFrac a)
      -> Maybe (StringFrac a)
      -> RatiosRow (StringFrac a))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v Object -> Text -> Parser (Maybe (StringFrac a))
forall a. FromJSON a => Object -> Text -> Parser a
.: Text
"Price to Free Cash Flow (quarterly)"
    Parser
  (Maybe (StringFrac a)
   -> Maybe (StringFrac a)
   -> Maybe (StringFrac a)
   -> Maybe (StringFrac a)
   -> Maybe (StringFrac a)
   -> Maybe (StringFrac a)
   -> Maybe (StringFrac a)
   -> RatiosRow (StringFrac a))
-> Parser (Maybe (StringFrac a))
-> Parser
     (Maybe (StringFrac a)
      -> Maybe (StringFrac a)
      -> Maybe (StringFrac a)
      -> Maybe (StringFrac a)
      -> Maybe (StringFrac a)
      -> Maybe (StringFrac a)
      -> RatiosRow (StringFrac a))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v Object -> Text -> Parser (Maybe (StringFrac a))
forall a. FromJSON a => Object -> Text -> Parser a
.: Text
"Price to Free Cash Flow (ttm)"
    Parser
  (Maybe (StringFrac a)
   -> Maybe (StringFrac a)
   -> Maybe (StringFrac a)
   -> Maybe (StringFrac a)
   -> Maybe (StringFrac a)
   -> Maybe (StringFrac a)
   -> RatiosRow (StringFrac a))
-> Parser (Maybe (StringFrac a))
-> Parser
     (Maybe (StringFrac a)
      -> Maybe (StringFrac a)
      -> Maybe (StringFrac a)
      -> Maybe (StringFrac a)
      -> Maybe (StringFrac a)
      -> RatiosRow (StringFrac a))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v Object -> Text -> Parser (Maybe (StringFrac a))
forall a. FromJSON a => Object -> Text -> Parser a
.: Text
"Enterprise Value (ttm)"
    Parser
  (Maybe (StringFrac a)
   -> Maybe (StringFrac a)
   -> Maybe (StringFrac a)
   -> Maybe (StringFrac a)
   -> Maybe (StringFrac a)
   -> RatiosRow (StringFrac a))
-> Parser (Maybe (StringFrac a))
-> Parser
     (Maybe (StringFrac a)
      -> Maybe (StringFrac a)
      -> Maybe (StringFrac a)
      -> Maybe (StringFrac a)
      -> RatiosRow (StringFrac a))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v Object -> Text -> Parser (Maybe (StringFrac a))
forall a. FromJSON a => Object -> Text -> Parser a
.: Text
"EV/EBITDA (ttm)"
    Parser
  (Maybe (StringFrac a)
   -> Maybe (StringFrac a)
   -> Maybe (StringFrac a)
   -> Maybe (StringFrac a)
   -> RatiosRow (StringFrac a))
-> Parser (Maybe (StringFrac a))
-> Parser
     (Maybe (StringFrac a)
      -> Maybe (StringFrac a)
      -> Maybe (StringFrac a)
      -> RatiosRow (StringFrac a))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v Object -> Text -> Parser (Maybe (StringFrac a))
forall a. FromJSON a => Object -> Text -> Parser a
.: Text
"EV/Sales (ttm)"
    Parser
  (Maybe (StringFrac a)
   -> Maybe (StringFrac a)
   -> Maybe (StringFrac a)
   -> RatiosRow (StringFrac a))
-> Parser (Maybe (StringFrac a))
-> Parser
     (Maybe (StringFrac a)
      -> Maybe (StringFrac a) -> RatiosRow (StringFrac a))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v Object -> Text -> Parser (Maybe (StringFrac a))
forall a. FromJSON a => Object -> Text -> Parser a
.: Text
"EV/FCF (ttm)"
    Parser
  (Maybe (StringFrac a)
   -> Maybe (StringFrac a) -> RatiosRow (StringFrac a))
-> Parser (Maybe (StringFrac a))
-> Parser (Maybe (StringFrac a) -> RatiosRow (StringFrac a))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v Object -> Text -> Parser (Maybe (StringFrac a))
forall a. FromJSON a => Object -> Text -> Parser a
.: Text
"Book to Market Value (ttm)"
    Parser (Maybe (StringFrac a) -> RatiosRow (StringFrac a))
-> Parser (Maybe (StringFrac a))
-> Parser (RatiosRow (StringFrac a))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v Object -> Text -> Parser (Maybe (StringFrac a))
forall a. FromJSON a => Object -> Text -> Parser a
.: Text
"Operating Income/EV (ttm)"