module ID3.WriteTag
( hWriteTag
, writeTag
) where

import ID3.Type
import ID3.Parser
import ID3.ReadTag
import Data.Accessor
import System.IO
import System.IO.Binary
--import Data.Word (Word8)

hWriteTag :: ID3Tag -> Handle -> IO ()
hWriteTag newTag hdl = do
    smth <- hReadTag hdl
    case smth of
         Nothing     -> insertTag (padding^=pad $ newTag) 0
         Just oldTag ->
                let diff = (getFullSize oldTag) - (getActualSize newTag)
                in  if diff <= 0
                       then insertTag (padding^=pad $ newTag) $ 10 + (oldTag^.size)
                       else do
                           hSeek hdl AbsoluteSeek 0
                           hPutBufStr hdl (unparse (padding^=diff $ newTag))
                           --rest <- readFrom $ 10+(oldTag^.size) :: IO [Word8]
                           --withBinaryFile "_m.mp3" WriteMode $ \h -> hPutBufStr h rest
    where
        pad = 4096      -- default padding size
        insertTag t pos = do
            hSeek hdl AbsoluteSeek pos
            rest <- hGetBufStr hdl . fromInteger =<< hFileSize hdl
            --withBinaryFile "_m.mp3" WriteMode $ \h -> hPutBufStr h rest
            hSeek hdl AbsoluteSeek 0
            hPutBufStr hdl (unparse t ++ rest)

writeTag ::  FilePath -> ID3Tag -> IO ()
writeTag file = withBinaryFile file ReadWriteMode . hWriteTag