module Codec.GlTF.Sampler
  ( SamplerIx(..)
  , Sampler(..)

  , SamplerWrap(..)
  , pattern CLAMP_TO_EDGE
  , pattern MIRRORED_REPEAT
  , pattern REPEAT

  , SamplerMagFilter(..)
  , pattern MAG_NEAREST
  , pattern MAG_LINEAR

  , SamplerMinFilter(..)
  , pattern MIN_NEAREST
  , pattern MIN_LINEAR
  , pattern MIN_NEAREST_MIPMAP_NEAREST
  , pattern MIN_LINEAR_MIPMAP_NEAREST
  , pattern MIN_NEAREST_MIPMAP_LINEAR
  , pattern MIN_LINEAR_MIPMAP_LINEAR
  ) where

import Codec.GlTF.Prelude

newtype SamplerIx = SamplerIx { unSamplerIx :: Int }
  deriving (Eq, Ord, Show, FromJSON, ToJSON, Generic)

-- | The root object for a glTF Sampler.
data Sampler = Sampler
  { wrapS      :: SamplerWrap
  , wrapT      :: SamplerWrap
  , magFilter  :: Maybe SamplerMagFilter
  , minFilter  :: Maybe SamplerMinFilter
  , name       :: Maybe Text
  , extensions :: Maybe Object
  , extras     :: Maybe Value
  } deriving (Eq, Show, Generic)

instance FromJSON Sampler where
  parseJSON = withObject "Sampler" \o -> do
    wrapS      <- o .:? "wrapS" .!= REPEAT
    wrapT      <- o .:? "wrapT" .!= REPEAT
    magFilter  <- o .:? "magFilter"
    minFilter  <- o .:? "minFilter"
    name       <- o .:? "name"
    extensions <- o .:? "extensions"
    extras     <- o .:? "extras"
    pure Sampler{..}

instance ToJSON Sampler where
  toJSON = gToJSON

-- | Wrapping mode.
--
-- All valid values correspond to WebGL enums.
newtype SamplerWrap = SamplerWrap { unSamplerWrap :: Int }
  deriving (Eq, Ord, Show, FromJSON, ToJSON, Generic)

pattern CLAMP_TO_EDGE :: SamplerWrap
pattern CLAMP_TO_EDGE = SamplerWrap 33071

pattern MIRRORED_REPEAT :: SamplerWrap
pattern MIRRORED_REPEAT = SamplerWrap 33648

pattern REPEAT :: SamplerWrap
pattern REPEAT = SamplerWrap 10497

-- | Magnification filter.
--
-- Valid values correspond to WebGL enums.
newtype SamplerMagFilter = SamplerMagFilter { unSamplerMagFilter :: Int }
  deriving (Eq, Ord, Show, FromJSON, ToJSON, Generic)

pattern MAG_NEAREST :: SamplerMagFilter
pattern MAG_NEAREST = SamplerMagFilter 9728

pattern MAG_LINEAR :: SamplerMagFilter
pattern MAG_LINEAR = SamplerMagFilter 9729

-- | Minification filter.
--
-- All valid values correspond to WebGL enums.
newtype SamplerMinFilter = SamplerMinFilter { unSamplerMinFilter :: Int }
  deriving (Eq, Ord, Show, FromJSON, ToJSON, Generic)

pattern MIN_NEAREST :: SamplerMinFilter
pattern MIN_NEAREST = SamplerMinFilter 9728

pattern MIN_LINEAR :: SamplerMinFilter
pattern MIN_LINEAR = SamplerMinFilter 9729

pattern MIN_NEAREST_MIPMAP_NEAREST :: SamplerMinFilter
pattern MIN_NEAREST_MIPMAP_NEAREST = SamplerMinFilter 9984

pattern MIN_LINEAR_MIPMAP_NEAREST :: SamplerMinFilter
pattern MIN_LINEAR_MIPMAP_NEAREST = SamplerMinFilter 9985

pattern MIN_NEAREST_MIPMAP_LINEAR :: SamplerMinFilter
pattern MIN_NEAREST_MIPMAP_LINEAR = SamplerMinFilter 9986

pattern MIN_LINEAR_MIPMAP_LINEAR :: SamplerMinFilter
pattern MIN_LINEAR_MIPMAP_LINEAR = SamplerMinFilter 9987