module Codec.Tiled.Layer
  ( Layer(..)
  , empty

  , pattern TILELAYER
  , pattern OBJECTGROUP
  , pattern IMAGELAYER
  , pattern GROUP
  ) where

import Data.Text (Text)
import Data.Vector (Vector)
import GHC.Generics (Generic)

import Codec.Tiled.Aeson (FromJSON(..), ToJSON(..), genericParseJSON, genericToJSON)
import Codec.Tiled.Layer.Chunk (Chunk)
import Codec.Tiled.Layer.Data (LayerData)
import Codec.Tiled.Object (Object)
import Codec.Tiled.Property (Property)

data Layer = Layer
  { Layer -> Maybe (Vector Chunk)
chunks           :: Maybe (Vector Chunk)    -- ^ Array of chunks (optional). @tilelayer@ only.
  , Layer -> Maybe Text
compression      :: Maybe Text              -- ^ @zlib@, @gzip@, @zstd@ or empty (default). @tilelayer@ only.
  , Layer -> Maybe LayerData
data_            :: Maybe LayerData         -- ^ Array of unsigned int (GIDs) or base64-encoded data. @tilelayer@ only.
  , Layer -> Maybe Text
draworder        :: Maybe Text              -- ^ @topdown@ (default) or @index@. @objectgroup@ only.
  , Layer -> Maybe Text
encoding         :: Maybe Text              -- ^ @csv@ (default) or @base64@. @tilelayer@ only.
  , Layer -> Maybe Int
height           :: Maybe Int               -- ^ Row count. Same as map height for fixed-size maps.
  , Layer -> Maybe Int
id               :: Maybe Int               -- ^ Incremental ID - unique across all layers
  , Layer -> Maybe FilePath
image            :: Maybe FilePath          -- ^ Image used by this layer. @imagelayer@ only.
  , Layer -> Maybe (Vector Layer)
layers           :: Maybe (Vector Layer)    -- ^ Array of layers. @group@ only.
  , Layer -> Maybe Bool
locked           :: Maybe Bool              -- ^ Whether layer is locked in the editor (default: false). (since Tiled 1.8.2)
  , Layer -> Text
name             :: Text                    -- ^ Name assigned to this layer
  , Layer -> Maybe (Vector Object)
objects          :: Maybe (Vector Object)   -- ^ Array of objects. @objectgroup@ only.
  , Layer -> Maybe Double
offsetX          :: Maybe Double            -- ^ Horizontal layer offset in pixels (default: 0)
  , Layer -> Maybe Double
offsetY          :: Maybe Double            -- ^ Vertical layer offset in pixels (default: 0)
  , Layer -> Double
opacity          :: Double                  -- ^ Value between 0 and 1.
  , Layer -> Maybe Double
parallaxX        :: Maybe Double            -- ^ Horizontal parallax factor for this layer (default: 1).
  , Layer -> Maybe Double
parallaxY        :: Maybe Double            -- ^ Vertical parallax factor for this layer (default: 1).
  , Layer -> Maybe (Vector Property)
properties       :: Maybe (Vector Property) -- ^ Array of Properties
  , Layer -> Maybe Bool
repeatX          :: Maybe Bool              -- ^ Whether the image drawn by this layer is repeated along the X axis. @imagelayer@ only.
  , Layer -> Maybe Bool
repeatY          :: Maybe Bool              -- ^ Whether the image drawn by this layer is repeated along the Y axis. @imagelayer@ only.
  , Layer -> Maybe Int
startX           :: Maybe Int               -- ^ X coordinate where layer content starts (for infinite maps)
  , Layer -> Maybe Int
startY           :: Maybe Int               -- ^ Y coordinate where layer content starts (for infinite maps)
  , Layer -> Maybe Text
tintColor        :: Maybe Text              -- ^ Hex-formatted tint color (#RRGGBB or #AARRGGBB) that is multiplied with any graphics drawn by this layer or any child layers (optional).
  , Layer -> Maybe Text
transparentColor :: Maybe Text              -- ^ Hex-formatted color (#RRGGBB) (optional). @imagelayer@ only.
  , Layer -> Text
type_            :: Text                    -- ^ @tilelayer@, @objectgroup@, @imagelayer@ or @group@
  , Layer -> Bool
visible          :: Bool                    -- ^ Whether layer is shown or hidden in editor
  , Layer -> Maybe Int
width            :: Maybe Int               -- ^ Column count. Same as map width for fixed-size maps.
  , Layer -> Maybe Int
x                :: Maybe Int               -- ^ Horizontal layer offset in tiles. Always 0.
  , Layer -> Maybe Int
y                :: Maybe Int               -- ^ Vertical layer offset in tiles. Always 0.
  }
  deriving (Layer -> Layer -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Layer -> Layer -> Bool
$c/= :: Layer -> Layer -> Bool
== :: Layer -> Layer -> Bool
$c== :: Layer -> Layer -> Bool
Eq, Int -> Layer -> ShowS
[Layer] -> ShowS
Layer -> FilePath
forall a.
(Int -> a -> ShowS) -> (a -> FilePath) -> ([a] -> ShowS) -> Show a
showList :: [Layer] -> ShowS
$cshowList :: [Layer] -> ShowS
show :: Layer -> FilePath
$cshow :: Layer -> FilePath
showsPrec :: Int -> Layer -> ShowS
$cshowsPrec :: Int -> Layer -> ShowS
Show, forall x. Rep Layer x -> Layer
forall x. Layer -> Rep Layer x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep Layer x -> Layer
$cfrom :: forall x. Layer -> Rep Layer x
Generic)

instance FromJSON Layer where
  parseJSON :: Value -> Parser Layer
parseJSON = forall a. (Generic a, GFromJSON Zero (Rep a)) => Value -> Parser a
genericParseJSON

instance ToJSON Layer where
  toJSON :: Layer -> Value
toJSON = forall a. (Generic a, GToJSON' Value Zero (Rep a)) => a -> Value
genericToJSON

empty  :: Layer
empty :: Layer
empty  = Layer
  { chunks :: Maybe (Vector Chunk)
chunks           = forall a. Maybe a
Nothing
  , compression :: Maybe Text
compression      = forall a. Maybe a
Nothing
  , data_ :: Maybe LayerData
data_            = forall a. Maybe a
Nothing
  , draworder :: Maybe Text
draworder        = forall a. Maybe a
Nothing
  , encoding :: Maybe Text
encoding         = forall a. Maybe a
Nothing
  , height :: Maybe Int
height           = forall a. Maybe a
Nothing
  , id :: Maybe Int
id               = forall a. Maybe a
Nothing
  , image :: Maybe FilePath
image            = forall a. Maybe a
Nothing
  , layers :: Maybe (Vector Layer)
layers           = forall a. Maybe a
Nothing
  , locked :: Maybe Bool
locked           = forall a. Maybe a
Nothing
  , name :: Text
name             = Text
""
  , objects :: Maybe (Vector Object)
objects          = forall a. Maybe a
Nothing
  , offsetX :: Maybe Double
offsetX          = forall a. Maybe a
Nothing
  , offsetY :: Maybe Double
offsetY          = forall a. Maybe a
Nothing
  , opacity :: Double
opacity          = Double
1.0
  , parallaxX :: Maybe Double
parallaxX        = forall a. Maybe a
Nothing
  , parallaxY :: Maybe Double
parallaxY        = forall a. Maybe a
Nothing
  , properties :: Maybe (Vector Property)
properties       = forall a. Maybe a
Nothing
  , repeatX :: Maybe Bool
repeatX          = forall a. Maybe a
Nothing
  , repeatY :: Maybe Bool
repeatY          = forall a. Maybe a
Nothing
  , startX :: Maybe Int
startX           = forall a. Maybe a
Nothing
  , startY :: Maybe Int
startY           = forall a. Maybe a
Nothing
  , tintColor :: Maybe Text
tintColor        = forall a. Maybe a
Nothing
  , transparentColor :: Maybe Text
transparentColor = forall a. Maybe a
Nothing
  , type_ :: Text
type_            = Text
""
  , visible :: Bool
visible          = Bool
True
  , width :: Maybe Int
width            = forall a. Maybe a
Nothing
  , x :: Maybe Int
x                = forall a. Maybe a
Nothing
  , y :: Maybe Int
y                = forall a. Maybe a
Nothing
  }

pattern TILELAYER :: Text
pattern $bTILELAYER :: Text
$mTILELAYER :: forall {r}. Text -> ((# #) -> r) -> ((# #) -> r) -> r
TILELAYER = "tilelayer"

pattern OBJECTGROUP :: Text
pattern $bOBJECTGROUP :: Text
$mOBJECTGROUP :: forall {r}. Text -> ((# #) -> r) -> ((# #) -> r) -> r
OBJECTGROUP = "objectgroup"

pattern IMAGELAYER :: Text
pattern $bIMAGELAYER :: Text
$mIMAGELAYER :: forall {r}. Text -> ((# #) -> r) -> ((# #) -> r) -> r
IMAGELAYER = "imagelayer"

pattern GROUP :: Text
pattern $bGROUP :: Text
$mGROUP :: forall {r}. Text -> ((# #) -> r) -> ((# #) -> r) -> r
GROUP = "group"