# frozen_string_literal: true

require 'slack-notifier'

module ChatMessage
  class BaseMessage
    RELATIVE_LINK_REGEX = /!\[[^\]]*\]\((\/uploads\/[^\)]*)\)/.freeze

    attr_reader :markdown
    attr_reader :user_full_name
    attr_reader :user_name
    attr_reader :user_avatar
    attr_reader :project_name
    attr_reader :project_url
    attr_reader :commit_message_html

    def initialize(params)
      @markdown = params[:markdown] || false
      @project_name = params.dig(:project, :path_with_namespace) || params[:project_name]
      @project_url = params.dig(:project, :web_url) || params[:project_url]
      @user_full_name = params.dig(:user, :name) || params[:user_full_name]
      @user_name = params.dig(:user, :username) || params[:user_name]
      @user_avatar = params.dig(:user, :avatar_url) || params[:user_avatar]
      @commit_message_html = params[:commit_message_html] || false
    end

    def user_combined_name
      if user_full_name.present?
        "#{user_full_name} (#{user_name})"
      else
        user_name
      end
    end

    def summary
      return message if markdown

      format(message)
    end

    def pretext
      summary
    end

    def fallback
      format(message)
    end

    def attachments
      raise NotImplementedError
    end

    def activity
      raise NotImplementedError
    end

    private

    def message
      raise NotImplementedError
    end

    def format(string)
      Slack::Notifier::LinkFormatter.format(format_relative_links(string))
    end

    def format_relative_links(string)
      string.gsub(RELATIVE_LINK_REGEX, "#{project_url}\\1")
    end

    def attachment_color
      '#345'
    end

    def link(text, url)
      "[#{text}](#{url})"
    end

    def pretty_duration(seconds)
      parse_string =
        if duration < 1.hour
          '%M:%S'
        else
          '%H:%M:%S'
        end

      Time.at(seconds).utc.strftime(parse_string)
    end
  end
end
