package initialize

import (
	"context"
	"kra/internal/biz/system"

	datasystem "kra/internal/data/system"
	datatask "kra/internal/data/task"
	platformmodule "kra/pkg/module"

	"gorm.io/gorm"
)

type Repo struct {
	backend Backend
	catalog platformmodule.Catalog
}

func NewRepo(backend Backend, catalog platformmodule.Catalog) system.InitializationRepo {
	return &Repo{backend: backend, catalog: catalog}
}

func (r *Repo) IsInitialized(ctx context.Context) (bool, error) {
	return r.backend.IsInitialized(ctx)
}

func (r *Repo) Initialize(ctx context.Context, input *system.DatabaseConfig) error {
	return r.backend.InitializeDatabase(ctx, input, func(ctx context.Context, db *gorm.DB) error {
		if err := datasystem.SeedSystemWithCatalog(ctx, db, input, r.catalog); err != nil {
			return err
		}
		return datatask.SeedDefaults(ctx, db, r.catalog.DefaultTimedTasks())
	})
}

func (r *Repo) PersistConfig(ctx context.Context) error {
	return r.backend.PersistConfig(ctx)
}

func (r *Repo) PersistAdminConfig(ctx context.Context, value []byte) error {
	return r.backend.PersistAdminConfig(ctx, value)
}

func (r *Repo) PersistRuntimeConfig(ctx context.Context, data, admin []byte) error {
	return r.backend.PersistRuntimeConfig(ctx, data, admin)
}

func (r *Repo) ReloadConfig(ctx context.Context) error {
	return r.backend.ReloadConfig(ctx)
}
