{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE OverloadedStrings #-}

module Generators where

import           Protolude
import qualified Data.Text as Txt
import           Hedgehog
import qualified Hedgehog.Gen as Gen
import qualified Hedgehog.Range as Range

import qualified Hyrax.Abi.Fasta as F

-- | Generate random set of nucleotides, including ambiguous ones
nucsGen :: GenT Identity Text
nucsGen = 
  Gen.text (Range.linear 1 1000) (Gen.element "ACGTMRWSYKVHDBNX")


-- | Generate random set of nucleotides, no ambiguous ones
nucsNoIupacGen :: (Monad m) => PropertyT m Text
nucsNoIupacGen = 
  forAll $ Gen.text (Range.linear 1 1000) (Gen.element "ACGT")

  
-- | Generate data to construct a fasta "file"
--   List of tuples of (name, lines of reads)
--      maxReads controls the max number in the list
genFastaData :: Int -> Gen [(Int, [Text])]
genFastaData maxReads = 
  Gen.list (Range.linear 1 maxReads) $
    (,) <$> Gen.int (Range.linear 1 9999) <*> Gen.list (Range.linear 1 15) nucsGen


-- | Convert fasta data to a single string
toFastaTxt :: Bool -> [(Int, [Text])] -> Text
toFastaTxt addSpaces is =
  Txt.intercalate "\n" $ toRead <$> is
  
  where
    toRead (weight, ls) =
      let sp = if addSpaces then "  " else "" in
      ">" <> sp <> show weight <> "\n" <> Txt.intercalate "\n" ls


-- | Convert fasta data to the expected list of FASTA values
toFasta :: [(Int, [Text])] -> [F.Fasta]
toFasta is =
  toRead <$> is
  
  where
    toRead (weight, ls) = F.Fasta (show weight) $ Txt.concat ls

