# frozen_string_literal: true
require 'aws-sdk'
require 'hako'

module Hako
  module Schedulers
    class EcsElb
      # @param [String] app_id
      # @param [Aws::ElasticLoadBalancing::Client] elb
      # @param [Hash] elb_config
      def initialize(app_id, elb, elb_config)
        @app_id = app_id
        @elb = elb
        @elb_config = elb_config
      end

      # @return [Aws::ElasticLoadBalancing::Types::LoadBalancerDescription]
      def describe_load_balancer
        @elb.describe_load_balancers(load_balancer_names: [name]).load_balancer_descriptions[0]
      end

      # @param [Fixnum] front_port
      # @return [nil]
      def find_or_create_load_balancer(front_port)
        if @elb_config
          unless exist?
            listeners = @elb_config.fetch('listeners').map do |l|
              {
                protocol: l.fetch('protocol'),
                load_balancer_port: l.fetch('load_balancer_port'),
                instance_port: front_port,
                ssl_certificate_id: l.fetch('ssl_certificate_id', nil),
              }
            end
            lb = @elb.create_load_balancer(
              load_balancer_name: name,
              listeners: listeners,
              subnets: @elb_config.fetch('subnets'),
              security_groups: @elb_config.fetch('security_groups'),
              scheme: @elb_config.fetch('scheme', nil),
              tags: @elb_config.fetch('tags', {}).map { |k, v| { key: k, value: v.to_s } },
            )
            Hako.logger.info "Created ELB #{lb.dns_name} with instance_port=#{front_port}"
          end
          name
        end
      end

      # @return [nil]
      def destroy
        if exist?
          @elb.delete_load_balancer(load_balancer_name: name)
          Hako.logger.info "Deleted ELB #{name}"
        else
          Hako.logger.info "ELB #{name} doesn't exist"
        end
      end

      # @return [Boolean]
      def exist?
        describe_load_balancer
        true
      rescue Aws::ElasticLoadBalancing::Errors::LoadBalancerNotFound
        false
      end

      # @return [String]
      def name
        "hako-#{@app_id}"
      end
    end
  end
end