{-# LANGUAGE CPP #-}
module Codec.Picture.Jpg.Metadata ( extractMetadatas, encodeMetadatas ) where

#if !MIN_VERSION_base(4,8,0)
import Control.Applicative( pure )
import Data.Monoid( mempty )
import Data.Word( Word )
#endif

import Data.Word( Word16 )
import Data.Maybe( fromMaybe )
import qualified Codec.Picture.Metadata as Met
import Codec.Picture.Metadata( Metadatas )
import Codec.Picture.Jpg.Types

scalerOfUnit :: JFifUnit -> Met.Keys Word -> Word16 -> Metadatas -> Metadatas
scalerOfUnit unit k v = case unit of
  JFifUnitUnknown -> id
  JFifPixelsPerInch -> Met.insert k (fromIntegral v)
  JFifPixelsPerCentimeter ->
    Met.insert k (Met.dotsPerCentiMeterToDotPerInch $ fromIntegral v)

extractMetadatas :: JpgJFIFApp0 -> Metadatas
extractMetadatas jfif =
    inserter Met.DpiX (_jfifDpiX jfif)
        $ inserter Met.DpiY (_jfifDpiY jfif) mempty
  where
    inserter = scalerOfUnit $ _jfifUnit jfif


encodeMetadatas :: Metadatas -> [JpgFrame]
encodeMetadatas metas = fromMaybe [] $ do
  dpiX <- Met.lookup Met.DpiX metas
  dpiY <- Met.lookup Met.DpiY metas
  pure . pure . JpgJFIF $ JpgJFIFApp0
    { _jfifUnit      = JFifPixelsPerInch
    , _jfifDpiX      = fromIntegral dpiX
    , _jfifDpiY      = fromIntegral dpiY
    , _jfifThumbnail = Nothing
    }