package tenant

import (
	"quyun/v2/app/http/tenant/dto"
	"quyun/v2/app/requests"
	"quyun/v2/app/services"
	"quyun/v2/database/models"
	"quyun/v2/pkg/consts"

	"github.com/gofiber/fiber/v3"
)

// me provides tenant context introspection endpoints (current tenant/user/tenant_user).
//
//	@provider
type me struct{}

// get
//
//	@Summary	当前租户上下文信息
//	@Tags		Tenant
//	@Accept		json
//	@Produce	json
//	@Param		tenantCode	path		string	true	"Tenant Code"
//	@Success	200			{object}	dto.MeResponse
//
//	@Router		/t/:tenantCode/v1/me [get]
//	@Bind		tenant local key(tenant)
//	@Bind		user local key(user)
//	@Bind		tenantUser local key(tenant_user)
func (*me) get(ctx fiber.Ctx, tenant *models.Tenant, user *models.User, tenantUser *models.TenantUser) (*dto.MeResponse, error) {
	return &dto.MeResponse{
		Tenant:     tenant,
		User:       user,
		TenantUser: tenantUser,
	}, nil
}

// balance
//
//	@Summary	当前租户余额信息
//	@Tags		Tenant
//	@Accept		json
//	@Produce	json
//	@Param		tenantCode	path		string	true	"Tenant Code"
//	@Success	200			{object}	dto.MeBalanceResponse
//
//	@Router		/t/:tenantCode/v1/me/balance [get]
//	@Bind		tenant local key(tenant)
//	@Bind		user local key(user)
func (*me) balance(ctx fiber.Ctx, tenant *models.Tenant, user *models.User) (*dto.MeBalanceResponse, error) {
	m, err := services.Ledger.MyBalance(ctx.Context(), tenant.ID, user.ID)
	if err != nil {
		return nil, err
	}
	return &dto.MeBalanceResponse{
		Currency:      consts.CurrencyCNY,
		Balance:       m.Balance,
		BalanceFrozen: m.BalanceFrozen,
		UpdatedAt:     m.UpdatedAt,
	}, nil
}

// ledgers
//
//	@Summary	当前租户余额流水（分页）
//	@Tags		Tenant
//	@Accept		json
//	@Produce	json
//	@Param		tenantCode	path		string	true	"Tenant Code"
//	@Success	200			{object}	requests.Pager{items=dto.MyLedgerItem}
//
//	@Router		/t/:tenantCode/v1/me/ledgers [get]
//	@Bind		tenant local key(tenant)
//	@Bind		user local key(user)
//	@Bind		filter query
func (*me) ledgers(ctx fiber.Ctx, tenant *models.Tenant, user *models.User, filter *dto.MyLedgerListFilter) (*requests.Pager, error) {
	return services.Ledger.MyLedgerPage(ctx.Context(), tenant.ID, user.ID, filter)
}
