{-# LANGUAGE OverloadedStrings          #-}
{-# LANGUAGE RecordWildCards            #-}

module Data.API.Doc.Dir
    ( dirHtml
    ) where

import           Data.API.Doc.Types
import           Data.API.Doc.Subst
import           Data.List
import           Data.Ord
import           Data.Char


-- | Generate a web page documenting all the 'Call's in a web
-- application
dirHtml :: DocInfo -> Dict -> [Call] -> String
dirHtml :: DocInfo -> Dict -> [Call] -> [Char]
dirHtml DocInfo
di Dict
dct [Call]
cls = forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat
    [ Dict -> [Char]
container_open                 Dict
dct
    , forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map (DocInfo -> Dict -> ([Char], [Call]) -> [Char]
resourceHtml DocInfo
di  Dict
dct) forall a b. (a -> b) -> a -> b
$ [Call] -> [([Char], [Call])]
aggregate [Call]
cls
    ]

aggregate :: [Call] -> [(String,[Call])]
aggregate :: [Call] -> [([Char], [Call])]
aggregate = forall a b. (a -> b) -> [a] -> [b]
map forall {a} {a}. [(a, a)] -> (a, [a])
f forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. (a -> a -> Bool) -> [a] -> [[a]]
groupBy forall {a} {b} {b}. Eq a => (a, b) -> (a, b) -> Bool
eq forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. (a -> a -> Ordering) -> [a] -> [a]
sortBy (forall a b. Ord a => (b -> a) -> b -> b -> Ordering
comparing forall a b. (a, b) -> a
fst) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a -> b) -> [a] -> [b]
map Call -> ([Char], Call)
x_r
  where
    x_r :: Call -> ([Char], Call)
x_r cl :: Call
cl@Call{Bool
[Char]
[[Char]]
[Sample]
[View]
[Param]
[Header]
Maybe (APIType, [Char])
call_samples :: Call -> [Sample]
call_views :: Call -> [View]
call_params :: Call -> [Param]
call_body :: Call -> Maybe (APIType, [Char])
call_headers :: Call -> [Header]
call_auth_required :: Call -> Bool
call_description :: Call -> [Char]
call_path :: Call -> [[Char]]
call_http_method :: Call -> [Char]
call_samples :: [Sample]
call_views :: [View]
call_params :: [Param]
call_body :: Maybe (APIType, [Char])
call_headers :: [Header]
call_auth_required :: Bool
call_description :: [Char]
call_path :: [[Char]]
call_http_method :: [Char]
..} =
        case [[Char]]
call_path of
          []     -> ([Char]
"/" ,Call
cl)
          [Char]
rsrc:[[Char]]
_ -> ([Char]
rsrc,Call
cl)

    eq :: (a, b) -> (a, b) -> Bool
eq (a
x,b
_) (a
y,b
_)   = a
xforall a. Eq a => a -> a -> Bool
==a
y

    f :: [(a, a)] -> (a, [a])
f []             = forall a. HasCallStack => [Char] -> a
error [Char]
"Data.API.Doc.Dir.aggregate"
    f ((a
rsrc,a
cl):[(a, a)]
ps) = (a
rsrc,a
clforall a. a -> [a] -> [a]
:forall a b. (a -> b) -> [a] -> [b]
map forall a b. (a, b) -> b
snd [(a, a)]
ps)


resourceHtml :: DocInfo -> Dict -> (String,[Call]) -> String
resourceHtml :: DocInfo -> Dict -> ([Char], [Call]) -> [Char]
resourceHtml DocInfo
di Dict
dct ([Char]
rsc,[Call]
cls) = forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat
    [ Dict -> [Char]
resource_heading      Dict
r_dct
    , Dict -> [Char]
ul_open               Dict
r_dct
    , forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [ DocInfo -> Dict -> Call -> [Char]
callHtml DocInfo
di  Dict
r_dct Call
cl | Call
cl<-[Call]
cls ]
    , Dict -> [Char]
ul_close              Dict
r_dct
    ]
  where
    r_dct :: Dict
r_dct = Dict -> [Char] -> Dict
resource_dict Dict
dct [Char]
rsc

resource_dict :: Dict -> String -> Dict
resource_dict :: Dict -> [Char] -> Dict
resource_dict Dict
dct [Char]
rsc = forall a b c. (a -> b -> c) -> b -> a -> c
flip [([Char], [Char])] -> Dict -> Dict
extDict Dict
dct
    [ (,) [Char]
"RESOURCE-HEADING"    [Char]
rsc
    ]

callHtml :: DocInfo -> Dict -> Call -> String
callHtml :: DocInfo -> Dict -> Call -> [Char]
callHtml DocInfo
di Dict
dct Call
cl = Dict -> [Char]
call forall a b. (a -> b) -> a -> b
$ DocInfo -> Dict -> Call -> Dict
call_dict DocInfo
di Dict
dct Call
cl

call_dict :: DocInfo -> Dict -> Call -> Dict
call_dict :: DocInfo -> Dict -> Call -> Dict
call_dict DocInfo
di Dict
dct Call{Bool
[Char]
[[Char]]
[Sample]
[View]
[Param]
[Header]
Maybe (APIType, [Char])
call_samples :: [Sample]
call_views :: [View]
call_params :: [Param]
call_body :: Maybe (APIType, [Char])
call_headers :: [Header]
call_auth_required :: Bool
call_description :: [Char]
call_path :: [[Char]]
call_http_method :: [Char]
call_samples :: Call -> [Sample]
call_views :: Call -> [View]
call_params :: Call -> [Param]
call_body :: Call -> Maybe (APIType, [Char])
call_headers :: Call -> [Header]
call_auth_required :: Call -> Bool
call_description :: Call -> [Char]
call_path :: Call -> [[Char]]
call_http_method :: Call -> [Char]
..} = forall a b c. (a -> b -> c) -> b -> a -> c
flip [([Char], [Char])] -> Dict -> Dict
extDict Dict
dct
    -- calls
    [ (,) [Char]
"CALL-URL"          forall a b. (a -> b) -> a -> b
$ DocInfo -> [Char] -> [[Char]] -> [Char]
doc_info_call_url DocInfo
di [Char]
call_http_method [[Char]]
call_path
    , (,) [Char]
"METHOD-CLASS"      forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map Char -> Char
toLower [Char]
mth_s
    , (,) [Char]
"METHOD"            forall a b. (a -> b) -> a -> b
$ [Char]
mth_s
    , (,) [Char]
"PATH"              forall a b. (a -> b) -> a -> b
$ Char
'/' forall a. a -> [a] -> [a]
: forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat (forall a. a -> [a] -> [a]
intersperse [Char]
"/" [[Char]]
call_path)
    , (,) [Char]
"BODY-TYPE"         forall a b. (a -> b) -> a -> b
$ forall b a. b -> (a -> b) -> Maybe a -> b
maybe [Char]
"&mdash;" (DocInfo -> APIType -> [Char]
renderAPIType DocInfo
di forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a, b) -> a
fst) Maybe (APIType, [Char])
call_body
    ]
  where
    mth_s :: [Char]
mth_s = [Char]
call_http_method
--    cvt   = T.unpack . _APINodeName

container_open :: Dict -> String
container_open :: Dict -> [Char]
container_open Dict
dct = Dict -> [[Char]] -> [Char]
prep Dict
dct
    [ [Char]
"<h2>"
    , [Char]
"   <<TITLE>>"
    , [Char]
"   <span class='tagline'><<TAGLINE>></span>"
    , [Char]
"</h2>"
    , [Char]
"<strong>Endpoint: </strong><<ENDPOINT>>"
    , [Char]
"<br>"
    , [Char]
"<div id='toc'>"
    , [Char]
"   <div id='app-description'>"
    , [Char]
"      <p><<SUMMARY>></p>"
    , [Char]
"   </div>"
    , [Char]
"   <hr/>"
    , [Char]
"   <br>"
    , [Char]
"   <h3 class='section-title'>"
    , [Char]
"      API Resources for This Application"
    , [Char]
"   </h3>"
    ]

resource_heading :: Dict -> String
resource_heading :: Dict -> [Char]
resource_heading Dict
dct = Dict -> [[Char]] -> [Char]
prep Dict
dct
    [ [Char]
"   <h5 class='tag'><<RESOURCE-HEADING>></h5>"
    ]

ul_open :: Dict -> String
ul_open :: Dict -> [Char]
ul_open Dict
dct = Dict -> [[Char]] -> [Char]
prep Dict
dct
    [ [Char]
"   <ul class='list resource-list'>"
    ]

call :: Dict -> String
call :: Dict -> [Char]
call Dict
dct = Dict -> [[Char]] -> [Char]
prep Dict
dct
    [ [Char]
"      <li >"
    , [Char]
"         <a class='reflink' href='<<CALL-URL>>'>"
    , [Char]
"         <span class='<<METHOD-CLASS>>'><<METHOD>></span>"
    , [Char]
"         <<PATH>>"
    , [Char]
"         </a>"
    , [Char]
"         <div class='post-data' ><<BODY-TYPE>></div>"
    , [Char]
"      </li>"
    ]

ul_close :: Dict -> String
ul_close :: Dict -> [Char]
ul_close Dict
dct = Dict -> [[Char]] -> [Char]
prep Dict
dct
    [ [Char]
"   </ul>"
    ]