# frozen_string_literal: true

module ReleaseTools
  module InternalRelease
    class DedicatedIssue < ReleaseTools::Issue
      include ::SemanticLogger::Loggable
      include ReleaseTools::InternalRelease::IssueHelper

      RELEASE_TYPE = 'internal'

      def initialize(*args)
        super

        @internal_versions = versions
      end

      def title
        "Internal release: #{internal_versions_info}"
      end

      def confidential?
        true
      end

      def labels
        [
          'internal releases',
          'group::GitLab Dedicated',
          'severity::1'
        ].join(', ')
      end

      def internal_versions_info
        internal_versions.join(', ')
      end

      def release_versions_info
        internal_versions.map do |version|
          ReleaseTools::Version.new(version).to_minor.to_s
        end.join(', ')
      end

      def due_date
        internal_release_task_issue.due_date
      end

      def planned_due_date
        due_date.presence || 'TBD - Release managers will provide an estimated date'
      end

      def assignees
        [
          '11218142',   # o-lluch - Dedicated EA manager
          '20257324',   # denhams - Dedicated EA manager
          '25360079'    # mckgl - Dedicated US PubSec manager
        ]
      end

      def project
        ReleaseTools::Project::Infrastructure::GitlabDedicated::Team
      end

      def security_issues
        task_issue_links.map(&:web_url).join(', ')
      end

      def release_managers_usernames
        release_managers.map do |release_manager|
          "@#{release_manager.username}"
        end.join(' ')
      end

      private

      attr_reader :internal_versions

      def client
        ReleaseTools::GitlabClient
      end

      def template_path
        File.expand_path('../../../templates/internal_release/dedicated_issue.md.erb', __dir__)
      end

      def task_issue_links
        @task_issue_links ||= Retriable.with_context(:api) do
          client.issue_links(ReleaseTools::Project::Release::Tasks, internal_release_task_issue.iid)
        end
      end

      def release_managers
        schedule.active_release_managers
      rescue ReleaseManagers::Schedule::VersionNotFoundError
        logger.fatal('Could not find active release managers')
        nil
      end

      def schedule
        @schedule ||= ReleaseManagers::Schedule.new
      end
    end
  end
end
