    {-|

    A ledger-compatible @print@ command.

    -}

    module Hledger.Cli.Print (
      print'
     ,showTransactions
     ,tests_Hledger_Cli_Print
    ) where
    import Data.List
    import Test.HUnit

    import Hledger
    import Prelude hiding (putStr)
    import Hledger.Utils.UTF8IOCompat (putStr)
    import Hledger.Cli.Options

    -- | Print journal transactions in standard format.
    print' :: CliOpts -> Journal -> IO ()
    print' CliOpts{reportopts_=ropts} j = do
      d <- getCurrentDay
      putStr $ showTransactions ropts (queryFromOpts d ropts) j

    showTransactions :: ReportOpts -> Query -> Journal -> String
    showTransactions opts q j = entriesReportAsText opts q $ entriesReport opts q j

    tests_showTransactions = [
      "showTransactions" ~: do

       -- "print expenses" ~:
       do
        let opts = defreportopts{query_="expenses"}
        d <- getCurrentDay
        showTransactions opts (queryFromOpts d opts) samplejournal `is` unlines
         ["2008/06/03 * eat & shop"
         ,"    expenses:food                $1"
         ,"    expenses:supplies            $1"
         ,"    assets:cash                 $-2"
         ,""
         ]

      -- , "print report with depth arg" ~:
       do
        let opts = defreportopts{depth_=Just 2}
        d <- getCurrentDay
        showTransactions opts (queryFromOpts d opts) samplejournal `is` unlines
          ["2008/01/01 income"
          ,"    assets:bank:checking            $1"
          ,"    income:salary                  $-1"
          ,""
          ,"2008/06/01 gift"
          ,"    assets:bank:checking            $1"
          ,"    income:gifts                   $-1"
          ,""
          ,"2008/06/03 * eat & shop"
          ,"    expenses:food                $1"
          ,"    expenses:supplies            $1"
          ,"    assets:cash                 $-2"
          ,""
          ,"2008/12/31 * pay off"
          ,"    liabilities:debts               $1"
          ,"    assets:bank:checking           $-1"
          ,""
          ]
     ]

    entriesReportAsText :: ReportOpts -> Query -> EntriesReport -> String
    entriesReportAsText _ _ items = concatMap showTransactionUnelided items

    tests_Hledger_Cli_Print = TestList
      tests_showTransactions