package repository

import (
	"baron-sso-backend/internal/domain"
	"context"

	"gorm.io/gorm"
	"gorm.io/gorm/clause"
)

type RPUserMetadataRepository interface {
	Get(ctx context.Context, clientID, userID string) (*domain.RPUserMetadata, error)
	Upsert(ctx context.Context, metadata *domain.RPUserMetadata) error
}

type rpUserMetadataRepository struct {
	db *gorm.DB
}

func NewRPUserMetadataRepository(db *gorm.DB) RPUserMetadataRepository {
	return &rpUserMetadataRepository{db: db}
}

func (r *rpUserMetadataRepository) Get(ctx context.Context, clientID, userID string) (*domain.RPUserMetadata, error) {
	var metadata domain.RPUserMetadata
	if err := r.db.WithContext(ctx).First(&metadata, "client_id = ? AND user_id = ?", clientID, userID).Error; err != nil {
		return nil, err
	}
	return &metadata, nil
}

func (r *rpUserMetadataRepository) Upsert(ctx context.Context, metadata *domain.RPUserMetadata) error {
	return r.db.WithContext(ctx).Clauses(clause.OnConflict{
		Columns: []clause.Column{
			{Name: "client_id"},
			{Name: "user_id"},
		},
		DoUpdates: clause.AssignmentColumns([]string{"metadata", "updated_at"}),
	}).Create(metadata).Error
}
