package api

import (
	"fmt"

	"github.com/pingcap/dbaas/billing2/config"
	"github.com/pingcap/dbaas/billing2/db/entity"
	"github.com/pingcap/dbaas/billing2/handler/centralhandler"

	"github.com/gin-gonic/gin"
	"github.com/pingcap/dbaas/billing2/forms"
	"github.com/pingcap/dbaas/billing2/handler/eventbushandler"
	"github.com/pingcap/dbaas/billing2/model/marketing/plan"
	"github.com/pingcap/dbaas/billing2/utils/ginutils"
)

type TenantPlanAPI struct{}

// @Summary Get Tenant Plan Info
// @Tags Plan
// @Description Get Tenant Plan Info
// @Accept  json
// @Produce json
// @Param tenant_id path string true "tenant_id"
// @Success 200 {object} forms.TenantPlanInfo
// @Router /tenants/{tenant_id}/plans [get]
func (s *TenantPlanAPI) GetTenantPlanInfo(c *gin.Context) (ginutils.HandlerFuncResult, error) {
	tenantID, err := getTenantIDFromURI(c)
	if err != nil {
		return nil, err
	}

	result, err := (&plan.TenantPlanModel{}).GetTenantEffectivePlan(tenantID)
	if err != nil {
		return nil, err
	}
	if result.EffectivePlan == entity.TenantPlan_POC {
		tenant, _ := centralhandler.GetCentralHandler().GetTenant(tenantID)
		if tenant.Kind == forms.TenantKindInternal || result.POCPlanInfo.StartedAt.Before(config.Get().GetTime(config.PocAfterNoPayable)) {

		} else {
			if result.POCPlanInfo.Status == entity.TenantPlanStatus_Active {
				result.POCPlanInfo.Status = entity.TenantPlanStatus_Closed
				if result.EffectivePlan == entity.TenantPlan_POC {
					result.EffectivePlan = entity.TenantPlan_DevTier
				}
			}

		}

	}
	return result, nil
}

// @Summary Notify Dev Tier Cluster Created
// @Tags Plan
// @Description Notify Dev Tier Cluster Created
// @Accept  json
// @Produce json
// @Param tenant_id path string true "tenant_id"
// @Success 200 {object} forms.OKType
// @Router /tenants/{tenant_id}/plans/dev_tier/notify_dev_tier_cluster_created [put]
func (s *TenantPlanAPI) NotifyDevTierClusterCreate(c *gin.Context) (ginutils.HandlerFuncResult, error) {
	tenantID, err := getTenantIDFromURI(c)
	if err != nil {
		return nil, err
	}

	err = eventbushandler.Get().PublishEvent(plan.DevTierClusterCreatedEventType, &eventbushandler.Event{
		EventID:   fmt.Sprint(tenantID),
		EventType: plan.DevTierClusterCreatedEventType,
		EventData: forms.TenantID{
			TenantID: tenantID,
		},
	})

	if err != nil {
		return nil, err
	}

	return forms.OK, nil
}

func InitializeTenantPlanRouter(router ginutils.MyRoute) {
	s := &TenantPlanAPI{}
	_ = s

	router.HandleWithError("GET", "/tenants/:tenant_id/plans", s.GetTenantPlanInfo)
	router.HandleWithError("PUT", "/tenants/:tenant_id/plans/dev_tier/notify_dev_tier_cluster_created", s.NotifyDevTierClusterCreate)
}

// InitializeInnerTenantPlanRouter registers the inner variants of the tenant plan
// endpoints. The handlers are identical to the public versions — same parameters,
// same response shape — only the route prefix differs (mounted under /inner/billing
// by RegisterInnerAPIRouter, no RBAC middleware).
func InitializeInnerTenantPlanRouter(router ginutils.MyRoute) {
	s := &TenantPlanAPI{}

	router.HandleWithError("GET", "/tenants/:tenant_id/plans", s.GetTenantPlanInfo)
}
