{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE RankNTypes #-}
module Data.TTask.Types.Types
  ( Point(..)
  , Id(..)
  , StatusLogRec
  , WorkTime(..)   
  , TStatusRecord(..) 
  , TStatus(..) 
  , Task(..) 
  , UserStory(..) 
  , Sprint(..) 
  , Project(..) 
  , TTaskContents(..)
  -- Lens accessers
  , taskId 
  , taskDescription 
  , taskPoint 
  , taskStatus 
  , taskWorkTimes 
  , storyId 
  , storyDescription 
  , storyTasks 
  , storyStatus 
  , sprintId 
  , sprintDescription 
  , sprintStorys 
  , sprintStatus 
  , projectName 
  , projectBacklog 
  , projectSprints
  , projectStatus
  ) where
import Data.Time
import Data.List
import Control.Lens

type Point = Int
type Id = Int
type StatusLogRec = (TTaskContents, TStatusRecord)

newtype WorkTime = WorkTime Double deriving (Show, Read, Eq)
data TStatusRecord 
  = StatusWait LocalTime 
  | StatusRunning LocalTime 
  | StatusFinished LocalTime 
  | StatusNotAchieved LocalTime 
  | StatusReject LocalTime 
  deriving (Show, Read, Eq)
data TStatus 
  = TStatusCons TStatusRecord TStatus 
  | TStatusOne TStatusRecord 
  deriving (Show, Read, Eq)

data Task = Task 
  { _taskId :: Id
  , _taskDescription :: String
  , _taskPoint :: Int
  , _taskStatus :: TStatus
  , _taskWorkTimes :: [WorkTime]
  } deriving (Show, Read, Eq)
data UserStory = UserStory 
  { _storyId :: Id
  , _storyDescription :: String
  , _storyTasks :: [Task]
  , _storyStatus :: TStatus
  } deriving (Show, Read, Eq)
data Sprint = Sprint 
  { _sprintId :: Id
  , _sprintDescription :: String
  , _sprintStorys :: [UserStory]
  , _sprintStatus :: TStatus
  } deriving (Show, Read, Eq)
data Project = Project
  { _projectName :: String
  , _projectBacklog :: [UserStory]
  , _projectSprints :: [Sprint]
  , _projectStatus :: TStatus
  } deriving (Show, Read, Eq)

data TTaskContents
  = TTaskProject Project
  | TTaskSprint Sprint
  | TTaskStory UserStory
  | TTaskTask Task

makeLenses ''Task
makeLenses ''UserStory
makeLenses ''Sprint
makeLenses ''Project