module Main where
-- module ExtractQuals where

import Bio.Sequence.SeqData
import Bio.Sequence.SFF
import Data.Map (Map)
import qualified Data.Map as M
import qualified Data.ByteString as B
import qualified Data.ByteString.Lazy as LB
import Data.Word

import Debug.Trace (trace)

main = do
   x <- mkTable "../../biolib/DZX0XNV01.sff"
   print x

type QualTable = Map Flow QualData

mkTable :: FilePath -> IO QualTable
mkTable f = readSFF f >>= return . buildTable

buildTable :: SFF -> QualTable
buildTable (SFF ch rs) = M.fromListWithKey check $ concatMap (tabulate . extract) rs

check k x y = k `seq` x `seq` y `seq` 
              if x == y then y else trace ("check failed: "++show k++" : "++show (LB.unpack y)++" "++show (LB.unpack x)) y

extract :: ReadBlock -> ([Flow],[Word8],QualData)
extract rb = (flowgram rb, B.unpack (flow_index rb), quality rb)

-- --------------------------------------------------
-- helper function for building qual table
-- NB! only feed with flows > 50
tabulate :: ([Flow],[Word8],QualData) -> [(Flow,QualData)]
tabulate ([],_,_) = []
tabulate (f:fs,i:is,qs)
    | i == 1  = let (iz,irest) = span (==0) is
                    (q1,qrest) = LB.splitAt (fromIntegral (length iz)+1) qs
                in f `seq` q1 `seq` (f,q1) : tabulate (fs,irest,qrest)
    | otherwise = tabulate (fs,i-1:is,qs)
tabulate (_,[],qs) = []

{-
    | B.null qs = []
    | f <= 50   = tabulate fs qs
    | otherwise = let count = (f + 50) `div` 100
                      (q1,qrest) = B.splitAt (fromIntegral count) qs
                  in (f,q1) : tabulate fs qrest
-}

printTable :: QualTable -> IO ()
printTable = putStrLn . unlines . map (\(x,y) -> show x ++ " " ++ show (LB.unpack y)) . M.toList
