module Data.Exo.Renderer.ExtRenderer where

import Control.Lens
import Data.Extensible
import Data.Exo.Types
import Data.Exo.ExoFormat

-- |
-- @
-- type ExtRendererR =
--   [ "_X" >: Double
--   , "_Y" >: Double
--   , "_Z" >: Double
--   , "_拡大率" >: Double
--   , "_透明度" >: Double
--   , "_縦横比" >: Double
--   , "_X軸回転" >: Double
--   , "_Y軸回転" >: Double
--   , "_Z軸回転" >: Double
--   , "_中心X" >: Double
--   , "_中心Y" >: Double
--   , "_中心Z" >: Double
--   , "_裏面を表示しない" >: Bool
--   , "blend" >: BlendMode
--   ]
-- @
type ExtRendererR =
  [ "_X" >: Double
  , "_Y" >: Double
  , "_Z" >: Double
  , "_拡大率" >: Double
  , "_透明度" >: Double
  , "_縦横比" >: Double
  , "_X軸回転" >: Double
  , "_Y軸回転" >: Double
  , "_Z軸回転" >: Double
  , "_中心X" >: Double
  , "_中心Y" >: Double
  , "_中心Z" >: Double
  , "_裏面を表示しない" >: Bool
  , "blend" >: BlendMode
  ]

newtype ExtRenderer = ExtRenderer { getExtRenderer :: Record ExtRendererR }
makeWrapped ''ExtRenderer

instance ExoFormat ExtRenderer where
  eformat n (ExtRenderer r)
    = unlinePairs $ toPairs
    $ #__name @= "拡張描画"
    <: #_X @= (r ^. #_X ^. to showt)
    <: #_Y @= (r ^. #_Y ^. to showt)
    <: #_Z @= (r ^. #_Z ^. to showt)
    <: #_拡大率 @= (r ^. #_拡大率 ^. to showt)
    <: #_透明度 @= (r ^. #_透明度 ^. to showt)
    <: #_縦横比 @= (r ^. #_縦横比 ^. to showt)
    <: #_X軸回転 @= (r ^. #_X軸回転 ^. to showt)
    <: #_Y軸回転 @= (r ^. #_Y軸回転 ^. to showt)
    <: #_Z軸回転 @= (r ^. #_Z軸回転 ^. to showt)
    <: #_中心X @= (r ^. #_中心X ^. to showt)
    <: #_中心Y @= (r ^. #_中心Y ^. to showt)
    <: #_中心Z @= (r ^. #_中心Z ^. to showt)
    <: #_裏面を表示しない @= (r ^. #_裏面を表示しない ^. to showBin)
    <: #blend @= (r ^. #blend ^. _blendMode)
    <: emptyRecord

  def = ExtRenderer
    $ #_X @= 0
    <: #_Y @= 0
    <: #_Z @= 0
    <: #_拡大率 @= 100
    <: #_透明度 @= 0
    <: #_縦横比 @= 0
    <: #_X軸回転 @= 0
    <: #_Y軸回転 @= 0
    <: #_Z軸回転 @= 0
    <: #_中心X @= 0
    <: #_中心Y @= 0
    <: #_中心Z @= 0
    <: #_裏面を表示しない @= False
    <: #blend @= Normal
    <: emptyRecord