//
//  CBlueprint.h
//  snowcrash
//  C Implementation of Blueprint.h for binding purposes
//
//  Created by Ali Khoramshahi on 13/6/14.
//  Copyright (c) 2014 Apiary Inc. All rights reserved.
//

#ifndef SC_C_BLUEPRINT_H
#define SC_C_BLUEPRINT_H

#include "Platform.h"
#include "stdlib.h"

#ifdef __cplusplus
extern "C" {
#endif

    /** brief Blueprint Parser Options */
    typedef unsigned int sc_blueprint_parser_options;

    /** brief Blueprint Parser Options Enums */
    enum sc_blueprint_parser_option {
        SC_RENDER_DESCRIPTIONS_OPTION = (1 << 0),       /// < Render Markdown in description.
        SC_REQUIRE_BLUEPRINT_NAME_OPTION = (1 << 1),    /// < Treat missing blueprint name as error
    };

    /** Parameter Use flag */
    typedef enum sc_parameter_use {
        SC_UNDEFINED_PARAMETER_USE,
        SC_OPTIONAL_PARAMETER_USE,
        SC_REQUIRED_PARAMETER_USE
    } sc_parameter_use;

    /** Class Blueprint wrapper */
    struct sc_blueprint_s;
    typedef struct sc_blueprint_s sc_blueprint_t;

    /** Array Metadata wrapper */
    struct sc_metadata_collection_s;
    typedef struct sc_metadata_collection_s sc_metadata_collection_t;

    /** Class Metadata wrapper */
    struct sc_metadata_s;
    typedef struct sc_metadata_s sc_metadata_t;

    /** Array Resource Groups wrapper */
    struct sc_resource_groups_collection_s;
    typedef struct sc_resource_groups_collection_s sc_resource_groups_collection_t;

    /** Class Resource Group wrapper */
    struct sc_resource_groups_s;
    typedef struct sc_resource_groups_s sc_resource_groups_t;

    /** Array Resources Collection wrapper */
    struct sc_resource_collection_s;
    typedef struct sc_resource_collection_s sc_resource_collection_t;

    /** Class Resources wrapper */
    struct sc_resource_s;
    typedef struct sc_resource_s sc_resource_t;

    /** Class Resource Model wrapper */
    struct sc_resource_model_s;
    typedef struct sc_resource_model_s sc_resource_model_t;

    /** Array Payload Collection wrapper */
    struct sc_payload_collection_s;
    typedef struct sc_payload_collection_s sc_payload_collection_t;

    /** Class Payload wrapper */
    struct sc_payload_s;
    typedef struct sc_payload_s sc_payload_t;

    /** Array Parameter wrapper */
    struct sc_parameter_collection_s;
    typedef struct sc_parameter_collection_s sc_parameter_collection_t;

    /** class Parameter wrapper */
    struct sc_parameter_s;
    typedef struct sc_parameter_s sc_parameter_t;

    /** Array Header wrapper */
    struct sc_header_collection_s;
    typedef struct sc_header_collection_s sc_header_collection_t;

    /** class Header wrapper */
    struct sc_header_s;
    typedef struct sc_header_s sc_header_t;

    /** Array Value wrapper */
    struct sc_value_collection_s;
    typedef struct sc_value_collection_s sc_value_collection_t;

    /** class Value wrapper */
    struct sc_value_s;
    typedef struct sc_value_s sc_value_t;

    /** Array Header wrapper */
    struct sc_header_collection_s;
    typedef struct sc_header_collection_s sc_header_collection_t;

    /** class Header wrapper */
    struct sc_header_s;
    typedef struct sc_header_s sc_header_t;

    /** Array Action wrapper */
    struct sc_action_collection_s;
    typedef struct sc_action_collection_s sc_action_collection_t;

    /** class Action wrapper */
    struct sc_action_s;
    typedef struct sc_action_s sc_action_t;

    /** Array Transaction Example wrapper */
    struct sc_transaction_example_collection_s;
    typedef struct sc_transaction_example_collection_s sc_transaction_example_collection_t;

    /** class Transaction Example wrapper */
    struct sc_transaction_example_s;
    typedef struct sc_transaction_example_s sc_transaction_example_t;

    /*----------------------------------------------------------------------*/

    /** \returns pointer to allocated Blueprint*/
    SC_API sc_blueprint_t* sc_blueprint_new();

    /** \deallocate Blueprint from pointer*/
    SC_API void sc_blueprint_free(sc_blueprint_t* blueprint);

    /** \returns Blueprint name */
    SC_API const char* sc_blueprint_name(const sc_blueprint_t* blueprint);

    /** \returns Blueprint description */
    SC_API const char* sc_blueprint_description(const sc_blueprint_t* blueprint);

    /*----------------------------------------------------------------------*/

    /** \returns Metadata Handle */
    SC_API const sc_metadata_collection_t* sc_metadata_collection_handle(const sc_blueprint_t* blueprint);

    /** \returns size of Metadata array */
    SC_API size_t sc_metadata_collection_size(const sc_metadata_collection_t* metadata);

    /*----------------------------------------------------------------------*/

    /** \returns Metadata at `index` handle */
    SC_API const sc_metadata_t* sc_metadata_handle(const sc_metadata_collection_t* metadata_col, size_t index);

    /** \returns Metadata key */
    SC_API const char* sc_metadata_key(const sc_metadata_t* metadata);

    /** \returns Metadata value */
    SC_API const char* sc_metadata_value(const sc_metadata_t* metadata);

    /*----------------------------------------------------------------------*/

    /** \returns Resource Groups Array Handle */
    SC_API const sc_resource_groups_collection_t* sc_resource_groups_collection_handle(const sc_blueprint_t* blueprint);

    /** \returns size of Resource Groups array */
    SC_API size_t sc_resource_groups_collection_size(const sc_resource_groups_collection_t* resource);

    /*----------------------------------------------------------------------*/

    /** \returns Resource Groups Handle */
    SC_API const sc_resource_groups_t* sc_resource_groups_handle(const sc_resource_groups_collection_t* resource, size_t index);

    /** \returns Resource Groups name */
    SC_API const char* sc_resource_groups_name(const sc_resource_groups_t* handle);

    /** \returns Resource Groups Description */
    SC_API const char* sc_resource_groups_description(const sc_resource_groups_t* handle);

    /*----------------------------------------------------------------------*/

    /** \returns Resource Array Handle */
    SC_API const sc_resource_collection_t* sc_resource_collection_handle(const sc_resource_groups_t* handle);

    /** \returns Resource array size*/
    SC_API size_t sc_resource_collection_size(const sc_resource_collection_t* resource);

    /*----------------------------------------------------------------------*/

    /** \returns Resource Handle */
    SC_API const sc_resource_t* sc_resource_handle(const sc_resource_collection_t* resource, size_t index);

    /** \returns Resource URITemplate */
    SC_API const char* sc_resource_uritemplate(const sc_resource_t* handle);

    /** \returns Resource name */
    SC_API const char* sc_resource_name(const sc_resource_t* handle);

    /** \returns Resource description */
    SC_API const char* sc_resource_description(const sc_resource_t* handle);

    /*----------------------------------------------------------------------*/

    /** \returns Payload Collection handle from TransactionExample for requests*/
    SC_API const sc_payload_collection_t* sc_payload_collection_handle_requests(const sc_transaction_example_t* handle);

    /** \returns Payload Collection handle from TransactionExample for responses*/
    SC_API const sc_payload_collection_t* sc_payload_collection_handle_responses(const sc_transaction_example_t* handle);

    /** \returns Payload Collection size */
    SC_API size_t sc_payload_collection_size(const sc_payload_collection_t* handle);

    /*----------------------------------------------------------------------*/

    /** \returns Payload at `index` Handle*/
    SC_API const sc_payload_t* sc_payload_handle(const sc_payload_collection_t* handle, size_t index);

    /** \returns Payload Handle from resource*/
    SC_API const sc_payload_t* sc_payload_handle_resource(const sc_resource_t* handle);

    /** \returns Payload name */
    SC_API const char* sc_payload_name(const sc_payload_t* handle);

    /** \returns Payload description */
    SC_API const char* sc_payload_description(const sc_payload_t* handle);

    /** \returns Payload body */
    SC_API const char* sc_payload_body(const sc_payload_t* handle);

    /** \returns Payload schema */
    SC_API const char* sc_payload_schema(const sc_payload_t* handle);

    /*----------------------------------------------------------------------*/

    /** \returns Parameter Collection handle from Payload*/
    SC_API const sc_parameter_collection_t* sc_parameter_collection_handle_payload(const sc_payload_t* handle);

    /** \returns Parameter Collection handle from Resource*/
    SC_API const sc_parameter_collection_t* sc_parameter_collection_handle_resource(const sc_resource_t* handle);

    /** \returns Parameter Collection handle from Action*/
    SC_API const sc_parameter_collection_t* sc_parameter_collection_handle_action(const sc_action_t* handle);

    /** \returns Parameter Collection size */
    SC_API size_t sc_parameter_collection_size(const sc_parameter_collection_t* handle);

    /*----------------------------------------------------------------------*/

    /** \returns Parameter handle */
    SC_API const sc_parameter_t* sc_parameter_handle(const sc_parameter_collection_t* handle, size_t index);

    /** \returns Parameter name */
    SC_API const char* sc_parameter_name(const sc_parameter_t* handle);

    /** \returns Parameter description */
    SC_API const char* sc_parameter_description(const sc_parameter_t* handle);

    /** \returns Parameter Type */
    SC_API const char* sc_parameter_type(const sc_parameter_t* handle);

    /** \returns Parameter Parameter Use */
    SC_API sc_parameter_use sc_parameter_parameter_use(const sc_parameter_t* handle);

    /** \returns Parameter Default Value */
    SC_API const char* sc_parameter_default_value(const sc_parameter_t* handle);

    /** \returns Parameter Example Value */
    SC_API const char* sc_parameter_example_value(const sc_parameter_t* handle);

    /*----------------------------------------------------------------------*/

    /** \returns Value Collection handle */
    SC_API const sc_value_collection_t* sc_value_collection_handle(const sc_parameter_t* handle);

    /** \returns Value Collection size */
    SC_API size_t sc_value_collection_size(const sc_value_collection_t* handle);

    /*----------------------------------------------------------------------*/

    /** \returns Value handle */
    SC_API const sc_value_t* sc_value_handle(const sc_value_collection_t* handle, size_t index);

    /** \returns Value string */
    SC_API const char* sc_value_string(const sc_value_t* handle);

    /*----------------------------------------------------------------------*/

    /** \returns Header Collection handle from Payload*/
    SC_API const sc_header_collection_t* sc_header_collection_handle_payload(const sc_payload_t* handle);

    /** \returns Header Collection handle from Resource*/
    SC_API const sc_header_collection_t* sc_header_collection_handle_resource(const sc_resource_t* handle);

    /** \returns Header Collection handle from Action*/
    SC_API const sc_header_collection_t* sc_header_collection_handle_action(const sc_action_t* handle);

    /** \returns Header Collection size */
    SC_API size_t sc_header_collection_size(const sc_header_collection_t* handle);

    /*----------------------------------------------------------------------*/

    /** \returns Header handle */
    SC_API const sc_header_t* sc_header_handle(const sc_header_collection_t* handle, size_t index);

    /** \returns Header Key */
    SC_API const char* sc_header_key(const sc_header_t* handle);

    /** \returns Header Value */
    SC_API const char* sc_header_value(const sc_header_t* handle);

    /*----------------------------------------------------------------------*/

    /** \returns Action Collection handle */
    SC_API const sc_action_collection_t* sc_action_collection_handle(const sc_resource_t* handle);

    /** \returns Action Collection size */
    SC_API size_t sc_action_collection_size(const sc_action_collection_t* handle);

    /*----------------------------------------------------------------------*/

    /** \returns Action handle */
    SC_API const sc_action_t* sc_action_handle(const sc_action_collection_t* handle, size_t index);

    /** \returns Action HTTPMethod */
    SC_API const char* sc_action_httpmethod(const sc_action_t* handle);

    /** \returns Action name */
    SC_API const char* sc_action_name(const sc_action_t* handle);

    /** \returns Action Description */
    SC_API const char* sc_action_description(const sc_action_t* handle);

    /*----------------------------------------------------------------------*/

    /** \returns Transaction Example Collection handle */
    SC_API const sc_transaction_example_collection_t* sc_transaction_example_collection_handle(const sc_action_t* handle);

    /** \returns Transaction Example Collection size */
    SC_API size_t sc_transaction_example_collection_size(const sc_transaction_example_collection_t* handle);

    /*----------------------------------------------------------------------*/

    /** \returns Transaction Example handle */
    SC_API const sc_transaction_example_t* sc_transaction_example_handle(const sc_transaction_example_collection_t* handle, size_t index);

    /** \returns Transaction Example name */
    SC_API const char* sc_transaction_example_name(const sc_transaction_example_t* handle);

    /** \returns Transaction Example Description */
    SC_API const char* sc_transaction_example_description(const sc_transaction_example_t* handle);

    /*----------------------------------------------------------------------*/

#ifdef __cplusplus
}
#endif

#endif