package repository

import (
	"context"
	"encoding/json"

	"gorm.io/gorm"

	caasmmodel "security-center-backend/internal/modules/caasm/model"
)

type ConfigRepository interface {
	Get(ctx context.Context) (*caasmmodel.Config, error)
	Upsert(ctx context.Context, data caasmmodel.Config) error
}

type gormConfigRepository struct {
	db *gorm.DB
}

func NewConfigRepository(db *gorm.DB) ConfigRepository {
	return &gormConfigRepository{db: db}
}

// Get returns the single config row (id=1), creating a default if missing.
func (r *gormConfigRepository) Get(ctx context.Context) (*caasmmodel.Config, error) {
	var cfg caasmmodel.Config
	err := r.db.WithContext(ctx).First(&cfg, 1).Error

	if err == gorm.ErrRecordNotFound {
		// Create default config
		defaults := caasmmodel.ConfigDefaults()
		defaultsJSON, _ := json.Marshal(defaults)
		var defaultsMap map[string]interface{}
		json.Unmarshal(defaultsJSON, &defaultsMap)

		cfg = caasmmodel.Config{
			Data: defaultsMap,
		}
		cfg.ID = 1
		if err := r.db.WithContext(ctx).Create(&cfg).Error; err != nil {
			return nil, err
		}
		return &cfg, nil
	}
	if err != nil {
		return nil, err
	}
	return &cfg, nil
}

// Upsert replaces the config row with id=1.
func (r *gormConfigRepository) Upsert(ctx context.Context, data caasmmodel.Config) error {
	data.ID = 1
	return r.db.WithContext(ctx).Save(&data).Error
}
