# frozen_string_literal: true

module ReleaseTools
  module Slack
    module InternalRelease
      class DedicatedStartNotifier
        include ::SemanticLogger::Loggable
        include ReleaseTools::InternalRelease::IssueHelper

        def initialize(internal_versions)
          @internal_versions = internal_versions
        end

        def execute
          logger.info("Notifying Dedicated about start of internal releases", internal_versions: internal_versions)

          send_notification
        end

        private

        attr_reader :internal_versions

        def send_notification
          message = <<~BODY
            :mega: :security-tanuki: Hello, the internal release has started targeting #{due_date} as the due date.
            We are preparing the following versions: #{internal_versions_message}.
            A message will be posted to this channel when the internal release is complete and the package is available in the `pre-release` channel.
            There is a Dedicated tracker issue that has been created: #{dedicated_issue_url}
            Notifying Dedicated managers: #{dedicated_managers}
          BODY

          slack_channels = [
            ReleaseTools::Slack::G_DEDICATED_TEAM,
            ReleaseTools::Slack::G_DEDICATED_ENVIRONMENT_AUTOMATION_TEAM,
            ReleaseTools::Slack::G_DEDICATED_US_PUBSEC
          ]

          return if SharedStatus.dry_run?

          slack_channels.each do |channel|
            Retriable.retriable do
              ReleaseTools::Slack::ChatopsNotification.fire_hook(
                text: "Internal release is starting.",
                channel: channel,
                blocks: [
                  {
                    type: 'section',
                    text: {
                      type: 'mrkdwn',
                      text: message
                    }
                  }
                ]
              )
            end
          end
        end

        def dedicated_managers
          [
            '@oriol',       # Dedicated EA manager
            '@denham',      # Dedicated EA manager
            '@mkirkevold'   # Dedicated US PubSec manager
          ].join(', ')
        end

        def internal_versions_message
          internal_versions.map(&:to_s).join(', ')
        end

        def due_date
          internal_release_dedicated_issue.due_date
        end

        def dedicated_issue_url
          internal_release_dedicated_issue.web_url
        end
      end
    end
  end
end
