module Codec.Tiled.Layer 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
(Layer -> Layer -> Bool) -> (Layer -> Layer -> Bool) -> Eq Layer
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
(Int -> Layer -> ShowS)
-> (Layer -> FilePath) -> ([Layer] -> ShowS) -> Show Layer
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. Layer -> Rep Layer x)
-> (forall x. Rep Layer x -> Layer) -> Generic Layer
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 = Value -> Parser Layer
forall a. (Generic a, GFromJSON Zero (Rep a)) => Value -> Parser a
genericParseJSON

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