
mixin Badge(method)
    //- Draw a badge for a given HTTP method
    case method
        when 'GET'
            span.badge.get: i.fa.fa-arrow-down
        when 'HEAD'
            span.badge.head: i.fa.fa-info-circle
        when 'OPTIONS'
            span.badge.options: i.fa.fa-dot-circle-o
        when 'POST'
            span.badge.post: i.fa.fa-plus
        when 'PUT'
            span.badge.put: i.fa.fa-pencil
        when 'PATCH'
            span.badge.patch: i.fa.fa-pencil
        when 'DELETE'
            span.badge.delete: i.fa.fa-times
        default
            span.badge: i.fa.fa-dot-circle-o

mixin Nav()
    //- Draw a navigation bar, which includes links to individual
    //- resources and actions.
    nav
        each resourceGroup in self.api.resourceGroups || []
            .resource-group
                .heading
                  .chevron
                    i.open.fa.fa-angle-down
                  a(href=resourceGroup.elementLink)= resourceGroup.name
                .collapse-content
                  ul: each resource in resourceGroup.resources || []
                      li
                          if !self.condenseNav || (resource.actions.length != 1)
                              a(href=resource.elementLink)= resource.name || 'Resource'
                              ul: each action in resource.actions || []
                                  li: a(href=action.elementLink)
                                    = action.name || action.method + ' ' + (action.attributes && action.attributes.uriTemplate || resource.uriTemplate)
                                    +Badge(action.method)
                          else
                              - var action = resource.actions[0]
                              a(href=action.elementLink)
                                  = resource.name || action.name || action.method + ' ' + (action.attributes && action.attributes.uriTemplate || resource.uriTemplate)
                                  +Badge(action.method)
        //- Link to the API hostname, e.g. api.yourcompany.com
        each meta in self.api.metadata || {}
            if meta.name == 'HOST'
                p(style="text-align: center; word-wrap: break-word;")
                    a(href=meta.value)= meta.value

mixin Parameters(params)
    //- Draw a definition list of parameter names, types, defaults,
    //- examples and descriptions.
    .title
        strong Parameters
        .collapse-button.show
            span.close Hide
            span.open Show
    .collapse-content
        dl.inner: each param in params || []
            dt= param.name
            dd
                code= param.type
                | &nbsp;
                if param.required
                    span.required (required)
                else
                    span (optional)
                | &nbsp;
                if param.default
                    span.text-info.default
                        strong Default:&nbsp;
                        span= param.default
                    | &nbsp;
                if param.example
                    span.text-muted.example
                        strong Example:&nbsp;
                        span= param.example
                != self.markdown(param.description)
                if param.values.length
                    p.choices
                        strong Choices:&nbsp;
                        each value in param.values
                            code= value.value
                            = ' '

mixin RequestResponse(title, request, resourceGroup, resource, action)
    .title
        strong
            = title
            if request.name
                | &nbsp;&nbsp;
                code= request.name
        if request.hasContent
            .collapse-button
                span.close Hide
                span.open Show
    if request.hasContent
        .collapse-content: .inner
            if request.description
                .description!= self.markdown(request.description)

            if Object.keys(request.headers).length
                h5 Headers
                pre: code
                    each item in request.headers
                        != self.highlight(item.name + ': ' + item.value, 'http')
                        br
                div(style="height: 1px;")
            if request.body
                h5 Body
                pre: code
                    != self.highlight(request.body, null, ['json', 'yaml', 'xml', 'javascript'])
                div(style="height: 1px;")
            if request.schema
                h5 Schema
                pre: code
                    != self.highlight(request.schema, null, ['json', 'yaml', 'xml'])
                div(style="height: 1px;")

mixin Examples(resourceGroup, resource, action)
    each example in action.examples
        each request in example.requests
            +RequestResponse('Request', request, resourceGroup, resource, action)
        each response in example.responses
            +RequestResponse('Response', response, resourceGroup, resource, action)

mixin Content()
    //- Page header and API description
    header
        h1#top= self.api.name || 'API Documentation'

    if self.api.description
        != self.markdown(self.api.description)

    //- Loop through and display information about all the resource
    //- groups, resources, and actions.
    each resourceGroup in self.api.resourceGroups || []
        section.resource-group(id=resourceGroup.elementId)
            h2= resourceGroup.name
                a.permalink(href=resourceGroup.elementLink): &para;
            if resourceGroup.description
                != self.markdown(resourceGroup.description)

            each resource in resourceGroup.resources || []
                .resource(id=resource.elementId)
                    h3= resource.name || 'Resource'
                        a.permalink(href=resource.elementLink): &para;
                    if resource.description
                        != self.markdown(resource.description)

                    each action in resource.actions || []
                        .action(class=action.methodLower, id=action.elementId)
                            h4
                                .name= action.name
                                a.method(class=action.methodLower, href=action.elementLink)
                                    = action.method
                                code.uri= (action.attributes && action.attributes.uriTemplate || resource.uriTemplate)
                            if action.description
                                != self.markdown(action.description)

                            //- A list of sub-sections for parameters, requests
                            //- and responses.
                            if action.parameters.length
                                +Parameters(action.parameters)
                            if action.examples
                                +Examples(resourceGroup, resource, action)
