#!/usr/bin/env ruby
# frozen_string_literal: true

require "optparse"
require "uri"

require_relative "../lib/gitlab_quality/test_tooling"

require_relative '../lib/gitlab_quality/test_tooling/code_coverage/category_owners'
require_relative '../lib/gitlab_quality/test_tooling/code_coverage/click_house/category_owners_table'

params = {}
required_params = [:clickhouse_url, :clickhouse_database, :clickhouse_username]

options = OptionParser.new do |opts|
  opts.banner = "Usage: #{$PROGRAM_NAME} [options]"

  opts.separator ""
  opts.separator "Syncs feature category ownership data from stages.yml to ClickHouse."
  opts.separator ""
  opts.separator "Options:"

  opts.on('--clickhouse-url URL', 'ClickHouse server URL') do |url|
    params[:clickhouse_url] = url
  end

  opts.on('--clickhouse-database DATABASE', 'ClickHouse database name') do |database|
    params[:clickhouse_database] = database
  end

  opts.on('--clickhouse-username USERNAME', 'ClickHouse username') do |username|
    params[:clickhouse_username] = username
  end

  opts.separator ""
  opts.separator "Environment variables:"
  opts.separator "  GLCI_CLICKHOUSE_METRICS_PASSWORD   ClickHouse password (required)"
  opts.separator ""

  opts.on('-h', '--help', 'Show the usage') do
    puts opts
    exit
  end

  opts.on_tail('-v', '--version', 'Show the version') do
    require_relative "../lib/gitlab_quality/test_tooling/version"
    puts "#{$PROGRAM_NAME} : #{GitlabQuality::TestTooling::VERSION}"
    exit
  end

  opts.parse(ARGV)
end

if params.any? && (required_params - params.keys).none?
  clickhouse_password = ENV.fetch('GLCI_CLICKHOUSE_METRICS_PASSWORD', nil)
  if clickhouse_password.to_s.strip.empty?
    puts "Error: GLCI_CLICKHOUSE_METRICS_PASSWORD environment variable must be set and not empty"
    exit 1
  end

  [:clickhouse_url, :clickhouse_database, :clickhouse_username].each do |param|
    if params[param].to_s.strip.empty?
      puts "Error: --#{param.to_s.tr('_', '-')} cannot be empty"
      exit 1
    end
  end

  begin
    uri = URI.parse(params[:clickhouse_url])
    unless uri.is_a?(URI::HTTP) || uri.is_a?(URI::HTTPS)
      puts "Error: --clickhouse-url must be a valid HTTP or HTTPS URL"
      exit 1
    end
  rescue URI::InvalidURIError
    puts "Error: --clickhouse-url is not a valid URL format"
    exit 1
  end

  category_owners = GitlabQuality::TestTooling::CodeCoverage::CategoryOwners.new

  category_owners_table = GitlabQuality::TestTooling::CodeCoverage::ClickHouse::CategoryOwnersTable.new(
    url: params[:clickhouse_url],
    database: params[:clickhouse_database],
    username: params[:clickhouse_username],
    password: clickhouse_password
  )

  category_owners_table.push(category_owners.as_db_table)

  puts "Successfully synced feature category ownership data to ClickHouse"
else
  puts "Missing argument(s). Required arguments are: #{required_params.map { |p| "--#{p.to_s.tr('_', '-')}" }.join(', ')}"
  puts options
  exit 1
end
