module Desert.New where

import Desert.Plugin (DesertPlugin (..))

import qualified Data.ByteString.Lazy as L
import Data.List (intercalate)
import Network.HTTP.Conduit (simpleHttp)
import System.Directory
import System.FilePath
import System.Process

plugin :: DesertPlugin
plugin = DesertPlugin $ \args -> do
  let packageName = head args

  putStrLn $ "Creating new project named " ++ packageName

  alreadyExists <- doesDirectoryExist packageName
  if (not alreadyExists) then createDirectory packageName else return ()

  setCurrentDirectory packageName

  let sourceDir = "src"
      testDir = "test"
      mainFilePath = sourceDir </> "main.ml"
      libHeaderFilePath = sourceDir </> "lib.mli"
      libFilePath = sourceDir </> "lib.ml"
      testFilePath = testDir </> "test.ml"
      readmeFilePath = "README.md" --File path is filename in current dir
      tagFilePath = "_tags"

  createDirectoryIfMissing True sourceDir
  createDirectoryIfMissing True testDir

  writeFile mainFilePath $ intercalate "\n"
    ["open Lib"
    ,""
    ,"let _ = Printf.printf \"hello, we get: %s\\n\" (str_of_t (succ (succ one_t)));"
    ]

  writeFile libHeaderFilePath $ intercalate "\n"
    ["type t"
    ,""
    ,"val one_t : t"
    ,"val succ : t -> t"
    ,"val str_of_t : t -> string"
    ]

  writeFile libFilePath $ intercalate "\n"
    ["type t = int"
    ,""
    ,"let one_t = 1"
    ,"let succ i = i+1"
    ,"let str_of_t = string_of_int"
    ]

  writeFile testFilePath $ intercalate "\n"
    ["open OUnit"
    ,"open Lib"
    ,""
    ,"let suite = \"OUnit tests...\" >:::  [\"Fix me\" >:: (fun () -> assert_equal \"1\" (str_of_t (succ (succ one_t))))]"
    ,""
    ,"let _ = run_test_tt_main suite"
    ]

  writeFile tagFilePath $ intercalate "\n"
    ["<src/**>: include"
    ,"<src/**>: package(core)"
    ,"<test/**>: include"
    ,"<test/**>: package(oUnit)"
    ,"true:thread"
    ]

  writeFile readmeFilePath $ intercalate "\n"
    ["#" ++ packageName ++ "!"]

  _ <- rawSystem "git" ["init"]

  simpleHttp "https://raw.githubusercontent.com/github/gitignore/master/OCaml.gitignore" >>= L.writeFile ".gitignore"

  return ()