-- |
-- Module      :  Main
-- Copyright   :  (c) OleksandrZhabenko 2020
-- License     :  MIT
-- Stability   :  Experimental
-- Maintainer  :  olexandr543@yahoo.com
--
-- Helps to order the 7 or less Ukrainian words (or their concatenations) 
-- to obtain somewhat suitable for poetry or music text.

module Main where

import Control.Exception (onException)
import System.IO
import DobutokO.Poetry (uniq10Poetical4,uniq10Poetical5,norm4,norm5,uniqNPoeticalG)
import System.Environment (getArgs)
import Melodics.Executable (recFileName, printInfoF, rawToSoundFile)
import Melodics.Ukrainian (appendS16LEFile, convertToProperUkrainian)
import EndOfExe (showE)
import Data.Maybe (fromJust,isJust)

-- | The first command line argument specifies which function to run. If given \"4\" it runs 'uniqNPoeticalG norm4', otherwise 'uniqNPoeticalG norm5'. 
-- The second command line argument (by default is considered equal to 10::Int) is an 'Int' number of the needed printed variants. The next 7 
-- are treated as the Ukrainian words to be ordered accordingly to the norm. For more information, please, refer to the documentation for the abovementioned 
-- functions. 
-- 
-- Afterwards, you can generate a sounding using 'workWithInput' in the \".wav\" format.
main :: IO ()
main = do
  args <- getArgs
  let arg0 = concat . take 1 $ args
      arg01 = concat . drop 1 . take 2 $ args
      word1s = unwords . drop 2 $ args
  arg1 <- onException (do
    let aa = read arg01::Int
    return aa) (return 10)
  case (arg0,arg1) of
   ("4",10) -> uniq10Poetical4 word1s
   (_,10) -> uniq10Poetical5 word1s
   ("4",n) -> uniqNPoeticalG n norm4 word1s
   ~(_,n) -> uniqNPoeticalG n norm5 word1s
  putStrLn "What string would you like to record as a Ukrainian text sounding by mmsyn6ukr package? "
  str <- getLine
  nameAndRec str

-- | Is used to specify a name for the recorded sounding for the selected text and to record it.
nameAndRec :: String -> IO ()
nameAndRec str = do
  name <- recFileName
  withBinaryFile (name ++ ".raw") AppendMode (appendS16LEFile (convertToProperUkrainian str))
  putStrLn "The .raw file was created by the program. If there is SoX installed then it will run further. "
  let ts = showE "sox"
  if isJust ts
    then rawToSoundFile "" name (fromJust ts)
    else printInfoF