module WASHGenerator (preprocess, preprocessPIPE) where {

import Control.Exception;
import Data.List (isPrefixOf);
import System.IO;

import WASHData ;
import Text.ParserCombinators.Parsec hiding (try) ;
import qualified WASHParser ;
import qualified WASHExpression ;
import qualified WASHClean ;
import WASHFlags ;

-- import Trace;

preprocess :: FLAGS -> String -> String -> String -> IO ();
preprocess flags srcName dstName globalDefs =
  bracket (openFile srcName ReadMode)
    (\ srcHandle -> hClose srcHandle)
    (\ srcHandle -> 
       bracket (openFile dstName WriteMode)
	 (\ dstHandle -> hClose dstHandle)
	 (\ dstHandle -> 
	  preprocessPIPE flags srcName srcHandle dstHandle globalDefs));


preprocessPIPE :: FLAGS -> String -> Handle -> Handle -> String -> IO ();
preprocessPIPE flags srcName srcHandle dstHandle globalDefs = do {
    input <- hGetContents srcHandle;
    let { parsing = parse WASHParser.washfile srcName input };
    case parsing of {
        Left error -> ioError $ userError $ show error;
        Right washfile ->
        hPutStrLn dstHandle (postprocess $ file flags globalDefs washfile "");
    };
};

file :: FLAGS -> String -> [CodeFrag] -> ShowS ;
file flags globalDefs fcode = 
  WASHExpression.code flags (WASHClean.cleanCodeFragList fcode) .
  showString globalDefs .
  showString "\n"
  ;

imports ::  [String] -> String ;
imports is = concat $ map (\m -> "import " ++ m ++ ";\n") is ;

postprocess :: String -> String ;
postprocess = unlines . postprocess' . lines ;

postprocess' :: [String] -> [String] ;
postprocess' [] = [] ;
postprocess' xs'@(x:xs) = 
  if "import" `isPrefixOf` x
  then "import qualified WASH.CGI.CGI as CGI" : xs'
  else x : postprocess' xs ;

}
