package fmc_repository

import (
	"chonho/pkg/model"
	"gorm.io/gorm"
)

type FCMRepository interface {
	Save(token *model.FcmToken) error
	ListUserTokens(userId int64) ([]string, error)
	FirstToken(filter TokenFilter) (*model.FcmToken, error)
}

type repository struct {
	db *gorm.DB
}
type TokenFilter struct {
	UserId   int64
	DeviceId string
}

func NewFCMRepository(db *gorm.DB) *repository {
	return &repository{
		db: db,
	}
}

func (r *repository) Save(token *model.FcmToken) error {
	return r.db.Save(token).Error
}

func (r *repository) ListUserTokens(userId int64) ([]string, error) {
	var tokens []model.FcmToken

	err := r.db.Where("user_id = ?", userId).Find(&tokens).Error
	if err != nil {
		return nil, err
	}

	result := make([]string, len(tokens))
	for i, tk := range tokens {
		result[i] = tk.RegistrationToken
	}
	return result, nil
}

func (r *repository) FirstToken(filter TokenFilter) (*model.FcmToken, error) {
	var token model.FcmToken
	builder := r.db.Model(&token)
	if filter.UserId != 0 {
		builder = builder.Where("user_id = ?", filter.UserId)
	}
	if filter.DeviceId != "" {
		builder = builder.Where("device_id = ?", filter.DeviceId)
	}
	err := builder.First(&token).Error
	if err != nil {
		return nil, err
	}
	return &token, nil
}
