package middleware

import (
	"context"

	"github.com/break/junhong_cmp_fiber/pkg/constants"
	"gorm.io/gorm"
)

// GetSubordinateShopIDs 获取当前用户可管理的店铺ID列表
// 返回 nil 表示不受数据权限限制（平台用户/超管）
// 返回 []uint 表示限制在这些店铺范围内（代理用户）
func GetSubordinateShopIDs(ctx context.Context) []uint {
	if ctx == nil {
		return nil
	}
	if ids, ok := ctx.Value(constants.ContextKeySubordinateShopIDs).([]uint); ok {
		return ids
	}
	return nil
}

// ApplyShopFilter 应用店铺数据权限过滤
// 平台用户/超管：不添加条件（SubordinateShopIDs 为 nil 或空数组）
// 代理用户：WHERE shop_id IN (subordinateShopIDs)
// 注意：NULL shop_id 的记录对代理用户不可见
func ApplyShopFilter(ctx context.Context, query *gorm.DB) *gorm.DB {
	shopIDs := GetSubordinateShopIDs(ctx)
	if len(shopIDs) == 0 {
		return query
	}
	return query.Where("shop_id IN ?", shopIDs)
}

// ApplyEnterpriseFilter 应用企业数据权限过滤
// 非企业用户：不添加条件
// 企业用户：WHERE enterprise_id = ?
func ApplyEnterpriseFilter(ctx context.Context, query *gorm.DB) *gorm.DB {
	userType := GetUserTypeFromContext(ctx)
	if userType != constants.UserTypeEnterprise {
		return query
	}
	enterpriseID := GetEnterpriseIDFromContext(ctx)
	if enterpriseID == 0 {
		// 企业用户但无企业ID，返回空结果
		return query.Where("1 = 0")
	}
	return query.Where("enterprise_id = ?", enterpriseID)
}

// ApplyOwnerShopFilter 应用归属店铺数据权限过滤
// 用于 Enterprise 等使用 owner_shop_id 字段的表
// 平台用户/超管：不添加条件（SubordinateShopIDs 为 nil 或空数组）
// 代理用户：WHERE owner_shop_id IN (subordinateShopIDs)
func ApplyOwnerShopFilter(ctx context.Context, query *gorm.DB) *gorm.DB {
	shopIDs := GetSubordinateShopIDs(ctx)
	if len(shopIDs) == 0 {
		return query
	}
	return query.Where("owner_shop_id IN ?", shopIDs)
}

// IsUnrestricted 检查当前用户是否不受数据权限限制
// 平台用户/超管返回 true，代理/企业用户返回 false
func IsUnrestricted(ctx context.Context) bool {
	return GetSubordinateShopIDs(ctx) == nil
}

// ApplySellerShopFilter 应用销售店铺数据权限过滤
// 用于 Order 等使用 seller_shop_id 字段的表
// 平台用户/超管：不添加条件（SubordinateShopIDs 为 nil 或空数组）
// 代理用户：WHERE seller_shop_id IN (subordinateShopIDs)
func ApplySellerShopFilter(ctx context.Context, query *gorm.DB) *gorm.DB {
	shopIDs := GetSubordinateShopIDs(ctx)
	if len(shopIDs) == 0 {
		return query
	}
	return query.Where("seller_shop_id IN ?", shopIDs)
}

// ApplyShopTagFilter 应用店铺标签数据权限过滤
// 用于 CardWallet 等使用 shop_id_tag 字段的表
// 平台用户/超管：不添加条件（SubordinateShopIDs 为 nil 或空数组）
// 代理用户：WHERE shop_id_tag IN (subordinateShopIDs)
func ApplyShopTagFilter(ctx context.Context, query *gorm.DB) *gorm.DB {
	shopIDs := GetSubordinateShopIDs(ctx)
	if len(shopIDs) == 0 {
		return query
	}
	return query.Where("shop_id_tag IN ?", shopIDs)
}

// ApplyShopIDFilter 应用店铺主键数据权限过滤
// 用于 Shop 表，根据 id 字段过滤
// 平台用户/超管：不添加条件（SubordinateShopIDs 为 nil 或空数组）
// 代理用户：WHERE id IN (subordinateShopIDs)
func ApplyShopIDFilter(ctx context.Context, query *gorm.DB) *gorm.DB {
	shopIDs := GetSubordinateShopIDs(ctx)
	if len(shopIDs) == 0 {
		return query
	}
	return query.Where("id IN ?", shopIDs)
}

// ApplyAllocatorShopFilter 应用分配者店铺数据权限过滤
// 用于 ShopSeriesAllocation、ShopPackageAllocation 等使用 allocator_shop_id 字段的表
// 代理用户只能看到自己作为分配者的记录
// 平台用户/超管：不添加条件（allocator_shop_id=0 表示平台分配）
// 代理用户：WHERE allocator_shop_id = 当前用户店铺ID
func ApplyAllocatorShopFilter(ctx context.Context, query *gorm.DB) *gorm.DB {
	userType := GetUserTypeFromContext(ctx)
	// 平台用户和超管不限制
	if userType == constants.UserTypeSuperAdmin || userType == constants.UserTypePlatform {
		return query
	}
	// 代理用户只能看到自己分配出去的记录
	shopID := GetShopIDFromContext(ctx)
	if shopID == 0 {
		// 代理用户但无店铺ID，返回空结果
		return query.Where("1 = 0")
	}
	return query.Where("allocator_shop_id = ?", shopID)
}
