package postgres

import (
	"context"

	"github.com/break/junhong_cmp_fiber/internal/model"
	"gorm.io/gorm"
)

// AssetIdentifierStore 全局资产标识符注册表存储层
type AssetIdentifierStore struct {
	db *gorm.DB
}

// NewAssetIdentifierStore 创建资产标识符注册表存储实例
func NewAssetIdentifierStore(db *gorm.DB) *AssetIdentifierStore {
	return &AssetIdentifierStore{db: db}
}

// Register 注册资产标识符
// 在同一事务内调用，冲突时事务回滚
func (s *AssetIdentifierStore) Register(ctx context.Context, identifier, assetType string, assetID uint) error {
	record := &model.AssetIdentifier{
		Identifier: identifier,
		AssetType:  assetType,
		AssetID:    assetID,
	}
	return s.db.WithContext(ctx).Create(record).Error
}

// FindByIdentifier 通过标识符精确查找资产注册记录
// 未命中时返回 nil, nil（非错误状态，调用方按需 fallback）
func (s *AssetIdentifierStore) FindByIdentifier(ctx context.Context, identifier string) (*model.AssetIdentifier, error) {
	var record model.AssetIdentifier
	err := s.db.WithContext(ctx).Where("identifier = ?", identifier).First(&record).Error
	if err == gorm.ErrRecordNotFound {
		return nil, nil
	}
	if err != nil {
		return nil, err
	}
	return &record, nil
}

// DeleteByAsset 删除资产时清理注册表（软删除时调用）
// 删除该资产对应的所有注册记录，允许标识符被后续资产复用
func (s *AssetIdentifierStore) DeleteByAsset(ctx context.Context, assetType string, assetID uint) error {
	return s.db.WithContext(ctx).
		Where("asset_type = ? AND asset_id = ?", assetType, assetID).
		Delete(&model.AssetIdentifier{}).Error
}
