module Tart.Format.V1
  ( version1Format
  , encodeVersion1
  )
where

import qualified Data.Binary as B

import Tart.Canvas
import Tart.Format.Types

data TartFileDataV1 =
    TartFileDataV1 { tartFileDataV1CanvasData  :: [CanvasData]
                   , tartFileDataV1CanvasNames :: [String]
                   , tartFileDataV1CanvasOrder :: [Int]
                   }

encodeVersion1 :: TartFile -> B.Put
encodeVersion1 = B.put . tartFileToDataV1

version1Format :: TartFileFormat
version1Format =
    BinaryFormatVersion B.get tartFileFromDataV1

instance B.Binary TartFileDataV1 where
    put d = do
        B.put $ tartFileDataV1CanvasData d
        B.put $ tartFileDataV1CanvasNames d
        B.put $ tartFileDataV1CanvasOrder d
    get = do
        TartFileDataV1 <$> B.get
                       <*> B.get
                       <*> B.get

tartFileToDataV1 :: TartFile -> TartFileDataV1
tartFileToDataV1 tf =
    TartFileDataV1 (canvasToData <$> tartFileCanvasList tf)
                   (tartFileCanvasNames tf)
                   (tartFileCanvasOrder tf)

tartFileFromDataV1 :: TartFileDataV1 -> IO (Either String TartFile)
tartFileFromDataV1 d = do
    let loadCanvases [] = return $ Right []
        loadCanvases (cd:cds) = do
            result <- canvasFromData cd
            case result of
                Left e -> return $ Left e
                Right c -> do
                    rest <- loadCanvases cds
                    case rest of
                        Left e -> return $ Left e
                        Right cs -> return $ Right $ c : cs

    result <- loadCanvases (tartFileDataV1CanvasData d)
    case result of
        Left s -> return $ Left s
        Right cs -> return $ Right $ TartFile cs (tartFileDataV1CanvasNames d)
                                                 (tartFileDataV1CanvasOrder d)