package main

import (
	"bytes"
	"context"
	"database/sql"
	"errors"
	"strings"
	"testing"
)

func TestParseMigrateWorkflowAlertsArgs(t *testing.T) {
	var stderr bytes.Buffer

	args, err := parseMigrateWorkflowAlertsArgs([]string{"dry-run", "--output-dir", "/tmp/report", "--allow-blockers"}, &stderr)
	if err != nil {
		t.Fatalf("parse migrate dry-run args: %v", err)
	}
	if args.mode != "dry-run" || args.outputDir != "/tmp/report" || !args.allowBlockers {
		t.Fatalf("parsed migrate args = %#v", args)
	}

	args, err = parseMigrateWorkflowAlertsArgs([]string{"--mode", "inventory", "--output-dir", "/tmp/report"}, &stderr)
	if err != nil {
		t.Fatalf("parse migrate inventory args: %v", err)
	}
	if args.mode != "inventory" || args.outputDir != "/tmp/report" {
		t.Fatalf("parsed migrate --mode args = %#v", args)
	}

	args, err = parseMigrateWorkflowAlertsArgs([]string{"apply-pack", "--output-dir", "/tmp/apply-pack"}, &stderr)
	if err != nil {
		t.Fatalf("parse migrate apply-pack args: %v", err)
	}
	if args.mode != "apply-pack" || args.outputDir != "/tmp/apply-pack" {
		t.Fatalf("parsed migrate apply-pack args = %#v", args)
	}

	args, err = parseMigrateWorkflowAlertsArgs([]string{"verify-zero", "--output-dir", "/tmp/verify-zero"}, &stderr)
	if err != nil {
		t.Fatalf("parse migrate verify-zero args: %v", err)
	}
	if args.mode != "verify-zero" || args.outputDir != "/tmp/verify-zero" {
		t.Fatalf("parsed migrate verify-zero args = %#v", args)
	}

	if _, err := parseMigrateWorkflowAlertsArgs([]string{"apply", "--output-dir", "/tmp/report"}, &stderr); err == nil {
		t.Fatal("parse migrate unsupported mode = nil, want error")
	}
	if _, err := parseMigrateWorkflowAlertsArgs([]string{"inventory"}, &stderr); err == nil {
		t.Fatal("parse migrate without output dir = nil, want error")
	}
	if _, err := parseMigrateWorkflowAlertsArgs([]string{"inventory", "--mode", "dry-run", "--output-dir", "/tmp/report"}, &stderr); err == nil {
		t.Fatal("parse migrate conflicting mode = nil, want error")
	}
	if _, err := parseMigrateWorkflowAlertsArgs([]string{"verify-zero", "--output-dir", "/tmp/report", "--allow-blockers"}, &stderr); err == nil {
		t.Fatal("parse migrate verify-zero with allow-blockers = nil, want error")
	}
}

func TestRunMigrateWorkflowAlertsCLIParsesArgsBeforeOpeningDatabase(t *testing.T) {
	var stdout, stderr bytes.Buffer
	opened := false
	code := runMigrateWorkflowAlertsCLI(
		context.Background(),
		[]string{"inventory"},
		&stdout,
		&stderr,
		func(context.Context) (*sql.DB, error) {
			opened = true
			return nil, errors.New("database should not be opened for invalid args")
		},
	)
	if code != 2 {
		t.Fatalf("exit code = %d, want 2 for invalid args", code)
	}
	if opened {
		t.Fatal("database opener was called before CLI args were validated")
	}
	if !strings.Contains(stderr.String(), "--output-dir is required") {
		t.Fatalf("stderr = %q, want output-dir validation error", stderr.String())
	}
	if stdout.Len() != 0 {
		t.Fatalf("stdout = %q, want empty output for invalid args", stdout.String())
	}
}
