package main

import (
	"context"
	"fmt"
	"strings"

	"github.com/jackc/pgx/v5"
)

func initializeDatabase(ctx context.Context, dsn string) error {
	cfg, err := pgx.ParseConfig(dsn)
	if err != nil {
		return err
	}
	name := cfg.Database
	if !strings.HasPrefix(name, "assignment_harness_") {
		return fmt.Errorf("database must use assignment_harness_ prefix")
	}
	cfg.Database = "postgres"
	c, err := pgx.ConnectConfig(ctx, cfg)
	if err != nil {
		return err
	}
	defer c.Close(ctx)
	var exists bool
	if err = c.QueryRow(ctx, `SELECT EXISTS(SELECT 1 FROM pg_database WHERE datname=$1)`, name).Scan(&exists); err != nil {
		return err
	}
	if exists {
		target, err := openDB(ctx, dsn)
		if err != nil {
			return err
		}
		defer target.Close(ctx)
		if err = guard(ctx, target); err != nil {
			return fmt.Errorf("existing database is unmarked; refusing to manage it: %w", err)
		}
		return nil
	}
	_, err = c.Exec(ctx, "CREATE DATABASE "+pgx.Identifier{name}.Sanitize())
	return err
}

func databaseURL(value string) string {
	if value == "" {
		return "dbname=assignment_harness_native"
	}
	return value
}
