module Options (splitArgs) where

import           Data.List
import           System.Console.GetOpt

splitArgs :: [String] -> ([String], [String])
splitArgs args = case break (== "--") $ reverse args of
  (xs, "--" : ys) -> (reverse ys, reverse xs)
  _ -> case filter isHspecArgs $ tails args of
    x : _ -> (dropEnd (length x) args, x)
    [] -> (args, [])
  where
    isHspecArgs xs = case getOpt Permute options xs of
      (_, [], []) -> True
      _ -> False

    dropEnd :: Int -> [a] -> [a]
    dropEnd n = reverse . drop n . reverse

options :: [OptDescr ()]
options = map ($ "") [
    Option []  ["help"]             (NoArg ())
  , Option "m" ["match"]            (ReqArg (const ()) "PATTERN")
  , Option []  ["skip"]             (ReqArg (const ()) "PATTERN")
  , Option []  ["color"]            (NoArg ())
  , Option []  ["no-color"]         (NoArg ())
  , Option "f" ["format"]           (ReqArg (const ()) "FORMATTER")
  , Option "o" ["out"]              (ReqArg (const ()) "FILE")
  , Option []  ["depth"]            (ReqArg (const ()) "N")
  , Option "a" ["qc-max-success"]   (ReqArg (const ()) "N")
  , Option []  ["qc-max-size"]      (ReqArg (const ()) "N")
  , Option []  ["qc-max-discard"]   (ReqArg (const ()) "N")
  , Option []  ["seed"]             (ReqArg (const ()) "N")
  , Option []  ["print-cpu-time"]   (NoArg ())
  , Option []  ["dry-run"]          (NoArg ())
  , Option []  ["fail-fast"]        (NoArg ())
  , Option "r" ["rerun"]            (NoArg ())
  ]