package main

import (
	"context"
	"flag"
	"fmt"
	"log/slog"
	"os"

	"archivmail/config"
	"archivmail/internal/storage"
)

// runRethread walks all emails without thread_id and sets thread relationships
// by parsing In-Reply-To / References headers.
//
// Usage: archivmail rethread [--config path] [--dry-run]
func runRethread(args []string) {
	fset := flag.NewFlagSet("rethread", flag.ExitOnError)
	configPath := fset.String("config", "/etc/archivmail/config.yml", "path to config file")
	dryRun := fset.Bool("dry-run", false, "simulate without writing changes")
	_ = fset.Parse(args)

	logger := slog.New(slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{Level: slog.LevelInfo}))

	cfg, err := config.Load(*configPath)
	if err != nil {
		fmt.Fprintf(os.Stderr, "error: load config: %v\n", err)
		os.Exit(1)
	}

	storeCfg := storage.Config{
		Dir:             cfg.Storage.StorePath,
		Keyfile:         cfg.Storage.Keyfile,
		DSN:             cfg.Database.DSN(),
		CompressEnabled: cfg.Storage.Compress,
	}
	mailStore, err := storage.New(storeCfg)
	if err != nil {
		fmt.Fprintf(os.Stderr, "error: storage init: %v\n", err)
		os.Exit(1)
	}
	defer mailStore.Close()

	if *dryRun {
		logger.Info("rethread: DRY-RUN — keine Änderungen werden gespeichert")
	}

	stats, err := mailStore.Rethread(context.Background(), *dryRun, logger)
	if err != nil {
		fmt.Fprintf(os.Stderr, "error: rethread: %v\n", err)
		os.Exit(1)
	}

	logger.Info("rethread: abgeschlossen",
		"total", stats.Total,
		"updated", stats.Updated,
		"skipped", stats.Skipped,
		"errors", stats.Errors,
	)

	if stats.Errors > 0 {
		os.Exit(1)
	}
}
