module ID3.ReadTag (hReadTag, readTag) where

import Data.Accessor
import ID3.Parser (run)
import ID3.Parser.Tag
import ID3.Parser.Header
import ID3.Type (ID3Tag)
import ID3.Type.Header
import System.IO
import System.IO.Binary

hReadTag :: Handle -> IO (Maybe ID3Tag)
hReadTag hdl = do
    hSeek hdl AbsoluteSeek 0
    beginning <- hGetBufStr hdl 10
    case run parseHeader beginning of
         (Left  _     , _) -> return Nothing
         (Right header, _) -> do
             chunk <- hGetBufStr hdl $ fromInteger (header^.tagSize)
             case run (parseTag_ header) chunk of
                  (Left  _  , _) -> return  Nothing
                  (Right tag, _) -> return (Just tag)

readTag :: FilePath -> IO (Maybe ID3Tag)
readTag file = withBinaryFile file ReadWriteMode hReadTag