content: module Types ( Note(..)
               , NoteId
               , NoteSignature(..)
               , noteIdToText
               , ApplicationResult(..)
               , Verbosity(..)
               ) where
  
  import Data.Aeson
  import Data.Aeson.Types
  import Data.Text (Text)
  import Data.Time.Clock (UTCTime)
  import Data.Time.Format
  import Database.SQLite.Simple
  import Database.SQLite.Simple.FromField
  import Database.SQLite.Simple.ToField
  
  
  -- * NoteId
  
  newtype NoteId = NoteId Text
      deriving (Eq, Ord, FromField, FromJSON, ToField)
  
  noteIdToText :: NoteId -> Text
  noteIdToText (NoteId t) = t
  
  
  -- * Note
  
  data Note = Note { note_id :: NoteId
                   , note_title :: Text
                   , note_text :: Text
                   , note_hash :: Text
                   , note_created :: Text
                   , note_updated :: Text
                   }
  
  instance ToRow Note where
      toRow (Note n_id n_title n_text n_hash n_created n_updated) =
          toRow (n_id, n_title, n_text, n_hash, n_created, n_updated)
  
  instance FromJSON Note where
      parseJSON (Object o) = Note <$>
                             o .: "id" <*>
                             o .: "title" <*>
                             o .: "text" <*>
                             o .: "hash" <*>
                             o .: "created_at" <*>
                             o .: "updated_at"
      parseJSON other = typeMismatch "Note" other
  
  
  -- * NoteSignature
  
  data NoteSignature = NoteSignature { ns_id :: NoteId
                                     , ns_updated :: UTCTime
                                     }
  
  instance FromJSON NoteSignature where
      parseJSON (Object o) = NoteSignature <$>
                             o .: "id" <*>
                             (o .: "updated_at" >>= timeFromString)
          where timeFromString = parseTimeM False defaultTimeLocale "%Y-%m-%d %H:%M:%S"
      parseJSON other = typeMismatch "NoteSignature" other
  
  -- * ApplicationResult
  
  -- | Structure describing how many notes were updated, newly added, deleted, and already up to date,
  -- respectively.
  data ApplicationResult = ApplicationResult Int Int Int Int
  
  -- * Verbosity
  
  data Verbosity = Verbose | Standard
      deriving (Eq)
  