require 'swagger/blocks'

require_relative 'devops_error'
require_relative 'devops_response'

module Devops
  module API3
    module Docs
      class ProviderRoutes

        include Swagger::Blocks

        swagger_path "/providers/available" do
          operation :get do
            key :description, 'Get providers list from configuration file'
            key :operationId, 'getProvidersAvailable'
            key :tags, [
              'provider'
            ]
            response 200 do
              key :description, 'Providers response'
              schema do
                key :type, :array
                items do
                  key :type, :string
                end
              end
            end
            response :default do
              key :description, 'error'
              schema do
                key :'$ref', :DevopsError
              end
            end
          end
        end

        swagger_path "/providers" do
          operation :get do
            key :description, 'Get providers list'
            key :operationId, 'getProviders'
            key :tags, [
              'provider'
            ]
            response 200 do
              key :description, 'Providers response'
              schema do
                key :type, :array
                items do
                  key :type, :string
                end
              end
            end
            response :default do
              key :description, 'error'
              schema do
                key :'$ref', :DevopsError
              end
            end
          end
        end

        swagger_schema :CommonAccount do
          allOf do
            schema do
              key :'$ref', :CommonAccountInput
            end
            schema do
              property :provider do
                key :type, :string
              end
              property :created_at do
                key :type, :integer
                key :format, :int64
              end
            end
          end
        end

        swagger_schema :CommonAccountInput do
          key :required, [:account_name, :ssh_key]
          property :account_name do
            key :type, :string
            key :pattern, "^[a-z_][a-z0-9_-]{0,99}$"
            key :maxLength, 100
          end
          property :description do
            key :type, :string
            key :maxLength, 500
          end
          property :ssh_key do
            key :type, :string
            key :pattern, "^[a-z_][a-z0-9_-]{0,99}$"
            key :maxLength, 100
          end
        end

        ###### static provider - begin
        swagger_path "/provider/static/accounts" do
          operation :get do
            key :description, 'Get static provider accounts'
            key :operationId, 'getStaticProviderAccounts'
            key :tags, [
              'provider'
            ]
            response 200 do
              key :description, 'Static provider account response'
              schema do
                key :type, :array
                items do
                  key :'$ref', :StaticProviderAccount
                end
              end
            end
            response :default do
              key :description, 'error'
              schema do
                key :'$ref', :DevopsError
              end
            end
          end
        end

        swagger_path "/provider/static/account" do
          operation :post do
            key :description, 'Create static provider account'
            key :operationId, 'createStaticProviderAccount'
            key :tags, [
              'provider'
            ]
            parameter do
              key :name, :account
              key :in, :body
              key :description, 'Account to add for static provider'
              key :required, true
              schema do
                key :'$ref', :StaticProviderAccountInput
              end
            end
            response 200 do
              key :description, 'Static provider account response'
              schema do
                key :'$ref', :StaticProviderAccountResponse
              end
            end
            response :default do
              key :description, 'error'
              schema do
                key :'$ref', :DevopsError
              end
            end
          end
        end

        swagger_schema :StaticProviderAccount do
          allOf do
            schema do
              key :'$ref', :CommonAccount
            end
          end
        end

        swagger_schema :StaticProviderAccountResponse do
          allOf do
            schema do
              key :'$ref', :DevopsResponse
            end
            schema do
              property :account do
                key :'$ref', :StaticProviderAccount
              end
            end
          end
        end

        swagger_schema :StaticProviderAccountInput do
          allOf do
            schema do
              key :'$ref', :CommonAccountInput
            end
          end
        end
        ###### static provider - end
        #
        ###### aws provider - begin
        swagger_path "/provider/aws/accounts" do
          operation :get do
            key :description, 'Get aws provider accounts'
            key :operationId, 'getAwsProviderAccounts'
            key :tags, [
              'provider'
            ]
            response 200 do
              key :description, 'Aws provider accounts response'
              schema do
                key :type, :array
                items do
                  key :'$ref', :AwsProviderAccount
                end
              end
            end
            response :default do
              key :description, 'error'
              schema do
                key :'$ref', :DevopsError
              end
            end
          end
        end

        swagger_path "/provider/aws/account" do
          operation :post do
            key :description, 'Create aws provider account'
            key :operationId, 'createAwsProviderAccount'
            key :tags, [
              'provider'
            ]
            parameter do
              key :name, :account
              key :in, :body
              key :description, 'Account to add for aws provider'
              key :required, true
              schema do
                key :'$ref', :AwsProviderAccountInput
              end
            end
            response 200 do
              key :description, 'Aws provider accounts response'
              schema do
                key :'$ref', :AwsProviderAccountResponse
              end
            end
            response :default do
              key :description, 'error'
              schema do
                key :'$ref', :DevopsError
              end
            end
          end
        end

        swagger_path "/provider/aws/account/{account_name}/vpcs" do
          operation :get do
            key :description, 'Get aws provider vpcs for account'
            key :operationId, 'getAwsProviderVpcs'
            key :tags, [
              'provider'
            ]
            parameter do
              key :name, :account_name
              key :in, :path
              key :description, 'Aws provider account name'
              key :required, true
              key :type, :string
            end
            response 200 do
              key :description, 'Aws provider account vpcs response'
              schema do
                key :type, :array
                items do
                  key :'$ref', :AwsProviderVpcResponse
                end
              end
            end
            response :default do
              key :description, 'error'
              schema do
                key :'$ref', :DevopsError
              end
            end
          end
        end

        swagger_schema :AwsProviderVpcResponse do
          property :vpc_id do
            key :type, :string
          end
          property :cidr do
            key :type, :string
          end
        end

        swagger_schema :AwsProviderAccount do
          allOf do
            schema do
              key :'$ref', :CommonAccount
            end
            schema do
              key :'$ref', :AwsProviderAccountInput
            end
          end
        end

        swagger_schema :AwsProviderAccountResponse do
          allOf do
            schema do
              key :'$ref', :DevopsResponse
            end
            schema do
              property :account do
                key :'$ref', :AwsProviderAccount
              end
            end
          end
        end

        swagger_schema :AwsProviderAccountInput do
          allOf do
            schema do
              key :'$ref', :CommonAccountInput
            end
            schema do
              key :required, [:account_name, :ssh_key, :use_iam_profile]
              property :access_key_id do
                key :type, :string
              end
              property :secret_access_key do
                key :type, :string
              end
              property :use_iam_profile do
                key :type, :boolean
              end
              property :storage_bucket_name do
                key :type, :string
              end
            end
          end
        end
        ###### aws provider - end

        swagger_path "/provider/{provider}/account/{account_name}" do
          operation :delete do
            key :description, 'Delete provider account'
            key :operationId, 'deleteProviderAccount'
            key :tags, [
              'provider'
            ]
            parameter do
              key :name, :provider
              key :in, :path
              key :description, 'Provider name'
              key :required, true
              key :type, :string
            end
            parameter do
              key :name, :account_name
              key :in, :path
              key :description, 'Provider account name'
              key :required, true
              key :type, :string
            end
            response 200 do
              key :description, 'Provider account response'
              schema do
                key :'$ref', :DevopsResponse
              end
            end
            response :default do
              key :description, 'error'
              schema do
                key :'$ref', :DevopsError
              end
            end
          end
        end

        swagger_path "/provider/{provider}/account/{account_name}/images" do
          operation :get do
            key :description, 'Get provider account images'
            key :operationId, 'getProviderImages'
            key :tags, [
              'provider'
            ]
            parameter do
              key :name, :provider
              key :in, :path
              key :description, 'Provider name'
              key :required, true
              key :type, :string
            end
            parameter do
              key :name, :account_name
              key :in, :path
              key :description, 'Aws provider account name'
              key :required, true
              key :type, :string
            end
            response 200 do
              key :description, 'Provider images response'
              schema do
                key :type, :array
                items do
                  key :'$ref', :ProviderImageResponse
                end
              end
            end
            response :default do
              key :description, 'error'
              schema do
                key :'$ref', :DevopsError
              end
            end
          end
        end

        swagger_schema :ProviderImageResponse do
          property :id do
            key :type, :string
          end
          property :name do
            key :type, :string
          end
          property :status do
            key :type, :string
          end
        end

        swagger_path "/provider/{provider}/account/{account_name}/networks" do
          operation :get do
            key :description, 'Get provider account networks'
            key :operationId, 'getProviderNetworks'
            key :tags, [
              'provider'
            ]
            parameter do
              key :name, :provider
              key :in, :path
              key :description, 'Provider name'
              key :required, true
              key :type, :string
            end
            parameter do
              key :name, :account_name
              key :in, :path
              key :description, 'Aws provider account name'
              key :required, true
              key :type, :string
            end
            response 200 do
              key :description, 'Provider networks response'
              schema do
                key :type, :array
                items do
                  key :'$ref', :ProviderNetworksResponse
                end
              end
            end
            response :default do
              key :description, 'error'
              schema do
                key :'$ref', :DevopsError
              end
            end
          end
        end

        swagger_schema :ProviderNetworksResponse do
          property :cidr do
            key :type, :string
          end
          property :vpcId do
            key :type, :string
          end
          property :subnetId do
            key :type, :string
          end
          property :name do
            key :type, :string
          end
          property :zone do
            key :type, :string
          end
        end

        swagger_path "/provider/{provider}/account/{account_name}/flavors" do
          operation :get do
            key :description, 'Get provider account flavors'
            key :operationId, 'getProviderFlavors'
            key :tags, [
              'provider'
            ]
            parameter do
              key :name, :provider
              key :in, :path
              key :description, 'Provider name'
              key :required, true
              key :type, :string
            end
            parameter do
              key :name, :account_name
              key :in, :path
              key :description, 'Aws provider account name'
              key :required, true
              key :type, :string
            end
            response 200 do
              key :description, 'Provider flavors response'
              schema do
                key :type, :array
                items do
                  key :'$ref', :ProviderFlavorsResponse
                end
              end
            end
            response :default do
              key :description, 'error'
              schema do
                key :'$ref', :DevopsError
              end
            end
          end
        end

        swagger_schema :ProviderFlavorsResponse do
          property :id do
            key :type, :string
          end
          property :cores do
            key :type, :integer
          end
          property :disk do
            key :type, :integer
          end
          property :name do
            key :type, :string
          end
          property :ram do
            key :type, :integer
          end
        end

        swagger_path "/provider/{provider}/account/{account_name}/security_groups" do
          operation :get do
            key :description, 'Get provider account security_groups'
            key :operationId, 'getProviderSecurityGroups'
            key :tags, [
              'provider'
            ]
            parameter do
              key :name, :provider
              key :in, :path
              key :description, 'Provider name'
              key :required, true
              key :type, :string
            end
            parameter do
              key :name, :account_name
              key :in, :path
              key :description, 'Aws provider account name'
              key :required, true
              key :type, :string
            end
            response 200 do
              key :description, 'Provider security groups response'
              schema do
                key :'$ref', :ProviderSecurityGroupsResponse
              end
            end
            response :default do
              key :description, 'error'
              schema do
                key :'$ref', :DevopsError
              end
            end
          end
        end

        swagger_schema :ProviderSecurityGroupsResponse do
          property :name_key do
            key :'$ref', :ProviderSecurityGroupsElem
          end
        end

        swagger_schema :ProviderSecurityGroupsElem do
          property :id do
            key :type, :string
          end
          property :description do
            key :type, :string
          end
          property :rules do
            key :type, :array
            items do
              key :'$ref', :ProviderSecurityGroupsRule
            end
          end
        end

        swagger_schema :ProviderSecurityGroupsRule do
          property :protocol do
            key :type, :string
          end
          property :from do
            key :type, :integer
          end
          property :to do
            key :type, :integer
          end
          property :cidr do
            key :type, :string
          end
        end

      end
    end
  end
end
