package tenant

import (
	"time"

	"quyun/v2/app/errorx"
	"quyun/v2/app/http/tenant/dto"
	"quyun/v2/app/requests"
	"quyun/v2/app/services"
	"quyun/v2/database/models"

	"github.com/gofiber/fiber/v3"
	log "github.com/sirupsen/logrus"
)

// tenantInviteAdmin 提供“租户管理员管理邀请码”的相关接口。
//
// @provider
type tenantInviteAdmin struct{}

// adminCreateInvite
//
//	@Summary	创建邀请码（租户管理）
//	@Tags		Tenant
//	@Accept		json
//	@Produce	json
//	@Param		tenantCode	path		string						true	"Tenant Code"
//	@Param		form		body		dto.AdminTenantInviteCreateForm	true	"Form"
//	@Success	200			{object}	models.TenantInvite
//
//	@Router		/t/:tenantCode/v1/admin/invites [post]
//	@Bind		tenant local key(tenant)
//	@Bind		tenantUser local key(tenant_user)
//	@Bind		form body
func (*tenantInviteAdmin) adminCreateInvite(
	ctx fiber.Ctx,
	tenant *models.Tenant,
	tenantUser *models.TenantUser,
	form *dto.AdminTenantInviteCreateForm,
) (*models.TenantInvite, error) {
	if err := requireTenantAdmin(tenantUser); err != nil {
		return nil, err
	}
	if form == nil {
		return nil, errorx.ErrInvalidParameter
	}

	log.WithFields(log.Fields{
		"tenant_id": tenant.ID,
		"user_id":   tenantUser.UserID,
	}).Info("tenant.admin.invites.create")

	return services.Tenant.AdminCreateInvite(ctx.Context(), tenant.ID, tenantUser.UserID, form)
}

// adminInviteList
//
//	@Summary	邀请码列表（租户管理）
//	@Tags		Tenant
//	@Accept		json
//	@Produce	json
//	@Param		tenantCode	path		string						true	"Tenant Code"
//	@Param		filter		query		dto.AdminTenantInviteListFilter	true	"Filter"
//	@Success	200			{object}	requests.Pager{items=models.TenantInvite}
//
//	@Router		/t/:tenantCode/v1/admin/invites [get]
//	@Bind		tenant local key(tenant)
//	@Bind		tenantUser local key(tenant_user)
//	@Bind		filter query
func (*tenantInviteAdmin) adminInviteList(
	ctx fiber.Ctx,
	tenant *models.Tenant,
	tenantUser *models.TenantUser,
	filter *dto.AdminTenantInviteListFilter,
) (*requests.Pager, error) {
	if err := requireTenantAdmin(tenantUser); err != nil {
		return nil, err
	}
	if filter == nil {
		filter = &dto.AdminTenantInviteListFilter{}
	}

	log.WithFields(log.Fields{
		"tenant_id": tenant.ID,
		"user_id":   tenantUser.UserID,
		"status":    filter.Status,
		"code":      filter.CodeTrimmed(),
	}).Info("tenant.admin.invites.list")

	return services.Tenant.AdminInvitePage(ctx.Context(), tenant.ID, filter)
}

// adminDisableInvite
//
//	@Summary	禁用邀请码（租户管理）
//	@Tags		Tenant
//	@Accept		json
//	@Produce	json
//	@Param		tenantCode	path		string							true	"Tenant Code"
//	@Param		inviteID		path		int64							true	"InviteID"
//	@Param		form		body		dto.AdminTenantInviteDisableForm	true	"Form"
//	@Success	200			{object}	models.TenantInvite
//
//	@Router		/t/:tenantCode/v1/admin/invites/:inviteID/disable [patch]
//	@Bind		tenant local key(tenant)
//	@Bind		tenantUser local key(tenant_user)
//	@Bind		inviteID path
//	@Bind		form body
func (*tenantInviteAdmin) adminDisableInvite(
	ctx fiber.Ctx,
	tenant *models.Tenant,
	tenantUser *models.TenantUser,
	inviteID int64,
	form *dto.AdminTenantInviteDisableForm,
) (*models.TenantInvite, error) {
	if err := requireTenantAdmin(tenantUser); err != nil {
		return nil, err
	}
	if inviteID <= 0 {
		return nil, errorx.ErrInvalidParameter.WithMsg("invite_id must be > 0")
	}
	if form == nil {
		return nil, errorx.ErrInvalidParameter
	}

	log.WithFields(log.Fields{
		"tenant_id":    tenant.ID,
		"user_id":      tenantUser.UserID,
		"invite_id":    inviteID,
		"disable_time": time.Now(),
	}).Info("tenant.admin.invites.disable")

	return services.Tenant.AdminDisableInvite(ctx.Context(), tenant.ID, tenantUser.UserID, inviteID, form.Reason)
}
