module Types.Interior where

import Data.Matrix as M

import Linear.V2

-- internal imports

import Types.Map
import Types.UserData
import Types.ReachPoint
import Types.ImgId
import Types.Direction

data Cluster
  = ClusterBox1
  | ClusterTable1
  | ClusterTable2
  | ClusterTable3
  | ClusterTable4
  | ClusterCornerTable
  | ClusterTableGroup
  deriving (Enum, Bounded)

clusterMat :: Cluster -> Matrix (Maybe ImgId)
clusterMat ClusterBox1 =
  M.fromLists
    -- [ [         Nothing]
    [ [Just ImgMiscBox1]
    -- , [Nothing,          Nothing, Nothing]
    ]
clusterMat ClusterTable1 =
  M.fromLists
    [[Just ImgEmpty, Just ImgMiscTable1]]
clusterMat ClusterTable2 =
  M.fromLists
    [ [Just ImgMiscTable2]
    , [Just ImgEmpty]
    ]
clusterMat ClusterTable3 =
  M.fromLists
    [[Just ImgMiscTable3, Just ImgEmpty]]
clusterMat ClusterTable4 =
  M.fromLists
    [ [Just ImgEmpty]
    , [Just ImgMiscTable4]
    ]
clusterMat ClusterCornerTable =
  M.fromLists
    [ [Just ImgMiscTable2, Just ImgMiscTableCorner]
    , [Just ImgEmpty     , Just ImgMiscTable1]
    ]
clusterMat ClusterTableGroup =
  M.fromLists
    [ [ Just ImgEmpty, Just ImgMiscTable2, Just ImgMiscTableCorner
      , Just ImgEmpty, Just ImgMiscTable2, Just ImgMiscTableCorner
      ]
    , [ Just ImgEmpty, Just ImgEmpty, Just ImgMiscTable1
      , Just ImgEmpty, Just ImgEmpty, Just ImgMiscTable1 
      ]
    , [ Just ImgEmpty, Just ImgEmpty, Just ImgEmpty
      , Just ImgEmpty, Just ImgEmpty, Just ImgEmpty
      ]
    , [ Nothing, Nothing, Nothing
      , Just ImgEmpty, Just ImgMiscTable2, Just ImgMiscTableCorner
      ]
    , [ Nothing, Nothing, Nothing
      , Just ImgEmpty, Just ImgEmpty, Just ImgMiscTable1
      ]
    ]

clusterRoom :: Cluster -> TileState
clusterRoom ClusterBox1 = Offi
clusterRoom ClusterTable1 = Offi
clusterRoom ClusterTable2 = Offi
clusterRoom ClusterTable3 = Offi
clusterRoom ClusterTable4 = Offi
clusterRoom ClusterCornerTable = Offi
clusterRoom ClusterTableGroup = Offi

clusterPoints :: Cluster -> [ReachPoint]
clusterPoints ClusterBox1 = []
clusterPoints ClusterTable1 =
  [ ReachPoint Table (V2 1 1) NE]
clusterPoints ClusterTable2 =
  [ ReachPoint Table (V2 2 1) NW]
clusterPoints ClusterTable3 =
  [ ReachPoint Table (V2 1 2) SW]
clusterPoints ClusterTable4 =
  [ ReachPoint Table (V2 1 1) SE]
clusterPoints ClusterCornerTable =
  [ ReachPoint Table (V2 2 1) N
  ]
clusterPoints ClusterTableGroup =
  [ ReachPoint Table (V2 2 2) N
  , ReachPoint Table (V2 2 5) N
  , ReachPoint Table (V2 5 5) N
  ]

instance Size Cluster where
  size c =
    let mat = clusterMat c
    in  fromIntegral ((nrows mat) * (ncols mat))
