# frozen_string_literal: true

require 'aws-sdk-lambda'

module AddyLambda
  class JwtIssuers
    ADDY = 0
  end

  class JwtAudiences
    GENERIC = 0
    PDF_ANNOTATE = 1
    SUBSCRIPTION = 2
  end

  JWT_AUDIENCES = %w[generic pdf_annotate subscription].freeze
  JWT_ISSUERS = ['addy'].freeze
  # Common functionality for AWS related activities
  class AWS
    # ssm_client = Aws::SSM::Client.new
    def self.get_ssm_value(ssm_client, path)
      request = {
        name: path,
        with_decryption: true
      }
      response = ssm_client.get_parameter(request)
      response.parameter.value
    end

    def self.invoke_lambda(lambda_client, function_name, payload, syncronous: true)
      resp = lambda_client.invoke({
                                    function_name: function_name,
                                    invocation_type: syncronous ? 'RequestResponse' : 'Event',
                                    payload: payload.to_json
                                  })
      AddyLambda::Common.valid_json?(resp.payload.string) ? JSON.parse(resp.payload.string) : resp.payload.string
    end

    # Lambda client can be obtained by running: lambda_client = Aws::Lambda::Client.new
    def self.post_slack_message(lambda_client, channel, message, emoji = ':tada', unfurl_links: false)
      input_params = {
        'user' => 'Signature Request',
        'channel' => channel,
        'message' => message,
        'emoji' => emoji,
        'unfurl_links' => unfurl_links
      }
      response_body = AddyLambda::AWS.invoke_lambda(lambda_client, 'slack-client', input_params)
      return response_body unless response_body.key?('error')

      logger.error(response_body['error'])
    end

    def self.send_email(lambda_client, recipient_emails, from_name, from_email, subject, content_html)
      input_params = {
        'recipient_list' => recipient_emails,
        'from_name' => from_name,
        'from_email' => from_email,
        'subject' => subject,
        'content_html' => content_html
      }

      response_body = AddyLambda::AWS.invoke_lambda(lambda_client, 'mailgun-client', input_params)
      return response_body unless response_body.key?('error')

      logger.error(response_body['error'])
    end

    # NOTE: issuer AddyLambda::JwtIssuers::..., Audience AddyLambda::JwtAudiences::...
    def self.generate_jwt(lambda_client, issuer, audience, expire, payload)
      lambda_payload = {
        'issuer' => JWT_ISSUERS[issuer],
        'audience' => JWT_AUDIENCES[audience],
        'expire' => expire,
        'payload' => payload
      }
      jwt_response = AddyLambda::AWS.invoke_lambda(lambda_client, 'jwt-generate', lambda_payload)
      jwt_response.key?('jwt') ? jwt_response['jwt'] : jwt_response
    end

    def self.validate_jwt(lambda_client, jwt)
      lambda_payload = {
        'jwt' => jwt
      }
      response = AddyLambda::AWS.invoke_lambda(lambda_client, 'jwt-validate', lambda_payload)
      response['statusCode'] == 200 ? JSON.parse(response['body']) : response
    end
  end
end