##
# This code was generated by
# \ / _    _  _|   _  _
#  | (_)\/(_)(_|\/| |(/_  v1.0.0
#       /       /
# 
# frozen_string_literal: true

module Twilio
  module REST
    class Studio < Domain
      class V1 < Version
        class FlowContext < InstanceContext
          class ExecutionContext < InstanceContext
            class ExecutionContextList < ListResource
              ##
              # Initialize the ExecutionContextList
              # @param [Version] version Version that contains the resource
              # @param [String] flow_sid The unique SID identifier of the Flow.
              # @param [String] execution_sid The unique SID identifier of the Execution.
              # @return [ExecutionContextList] ExecutionContextList
              def initialize(version, flow_sid: nil, execution_sid: nil)
                super(version)

                # Path Solution
                @solution = {flow_sid: flow_sid, execution_sid: execution_sid}
              end

              ##
              # Provide a user friendly representation
              def to_s
                '#<Twilio.Studio.V1.ExecutionContextList>'
              end
            end

            class ExecutionContextPage < Page
              ##
              # Initialize the ExecutionContextPage
              # @param [Version] version Version that contains the resource
              # @param [Response] response Response from the API
              # @param [Hash] solution Path solution for the resource
              # @return [ExecutionContextPage] ExecutionContextPage
              def initialize(version, response, solution)
                super(version, response)

                # Path Solution
                @solution = solution
              end

              ##
              # Build an instance of ExecutionContextInstance
              # @param [Hash] payload Payload response from the API
              # @return [ExecutionContextInstance] ExecutionContextInstance
              def get_instance(payload)
                ExecutionContextInstance.new(
                    @version,
                    payload,
                    flow_sid: @solution[:flow_sid],
                    execution_sid: @solution[:execution_sid],
                )
              end

              ##
              # Provide a user friendly representation
              def to_s
                '<Twilio.Studio.V1.ExecutionContextPage>'
              end
            end

            class ExecutionContextContext < InstanceContext
              ##
              # Initialize the ExecutionContextContext
              # @param [Version] version Version that contains the resource
              # @param [String] flow_sid The unique SID identifier of the Flow.
              # @param [String] execution_sid The unique SID identifier of the Execution.
              # @return [ExecutionContextContext] ExecutionContextContext
              def initialize(version, flow_sid, execution_sid)
                super(version)

                # Path Solution
                @solution = {flow_sid: flow_sid, execution_sid: execution_sid, }
                @uri = "/Flows/#{@solution[:flow_sid]}/Executions/#{@solution[:execution_sid]}/Context"
              end

              ##
              # Fetch a ExecutionContextInstance
              # @return [ExecutionContextInstance] Fetched ExecutionContextInstance
              def fetch
                params = Twilio::Values.of({})

                payload = @version.fetch(
                    'GET',
                    @uri,
                    params,
                )

                ExecutionContextInstance.new(
                    @version,
                    payload,
                    flow_sid: @solution[:flow_sid],
                    execution_sid: @solution[:execution_sid],
                )
              end

              ##
              # Provide a user friendly representation
              def to_s
                context = @solution.map {|k, v| "#{k}: #{v}"}.join(',')
                "#<Twilio.Studio.V1.ExecutionContextContext #{context}>"
              end
            end

            class ExecutionContextInstance < InstanceResource
              ##
              # Initialize the ExecutionContextInstance
              # @param [Version] version Version that contains the resource
              # @param [Hash] payload payload that contains response from Twilio
              # @param [String] flow_sid The unique SID identifier of the Flow.
              # @param [String] execution_sid The unique SID identifier of the Execution.
              # @return [ExecutionContextInstance] ExecutionContextInstance
              def initialize(version, payload, flow_sid: nil, execution_sid: nil)
                super(version)

                # Marshaled Properties
                @properties = {
                    'account_sid' => payload['account_sid'],
                    'context' => payload['context'],
                    'flow_sid' => payload['flow_sid'],
                    'execution_sid' => payload['execution_sid'],
                    'url' => payload['url'],
                }

                # Context
                @instance_context = nil
                @params = {'flow_sid' => flow_sid, 'execution_sid' => execution_sid, }
              end

              ##
              # Generate an instance context for the instance, the context is capable of
              # performing various actions.  All instance actions are proxied to the context
              # @return [ExecutionContextContext] ExecutionContextContext for this ExecutionContextInstance
              def context
                unless @instance_context
                  @instance_context = ExecutionContextContext.new(
                      @version,
                      @params['flow_sid'],
                      @params['execution_sid'],
                  )
                end
                @instance_context
              end

              ##
              # @return [String] Account Sid.
              def account_sid
                @properties['account_sid']
              end

              ##
              # @return [Hash] Flow state.
              def context
                @properties['context']
              end

              ##
              # @return [String] Flow Sid.
              def flow_sid
                @properties['flow_sid']
              end

              ##
              # @return [String] Execution Sid.
              def execution_sid
                @properties['execution_sid']
              end

              ##
              # @return [String] The URL of this resource.
              def url
                @properties['url']
              end

              ##
              # Fetch a ExecutionContextInstance
              # @return [ExecutionContextInstance] Fetched ExecutionContextInstance
              def fetch
                context.fetch
              end

              ##
              # Provide a user friendly representation
              def to_s
                values = @params.map{|k, v| "#{k}: #{v}"}.join(" ")
                "<Twilio.Studio.V1.ExecutionContextInstance #{values}>"
              end

              ##
              # Provide a detailed, user friendly representation
              def inspect
                values = @properties.map{|k, v| "#{k}: #{v}"}.join(" ")
                "<Twilio.Studio.V1.ExecutionContextInstance #{values}>"
              end
            end
          end
        end
      end
    end
  end
end