package org

import (
	"net/http"
	"strconv"

	"github.com/gin-gonic/gin"
	"github.com/pingcap/log"
	"go.uber.org/zap"

	error2 "github.com/pingcap-inc/clinic/pkg/api/error"
	"github.com/pingcap-inc/clinic/pkg/datasource"
)

// @Summary		List projects
// @Tags			Organization
// @Description	list projects of the specified organization (only for cloud orgs)
// @Produce		json
// @Param			x-csrf-token	header		string	true	"get value from login.ValidationResp response"
// @Param			oid				path		string	true	"organization id"
// @Success		200				{object}	ListProjectsResp
// @Router			/orgs/{oid}/projects [get]
func (s *OrganizationService) ListProjects(c *gin.Context) {
	u, org, ok, err := s.canReadOrganization(c)
	if err != nil {
		_ = c.Error(error2.ErrNotFound.New("%s", err.Error()))
		return
	}
	if !ok {
		_ = c.Error(error2.ErrForbidden.New("permission deny"))
		return
	}
	if org.OrgType != "cloud" {
		_ = c.Error(error2.ErrForbidden.New("not a cloud org"))
		return
	}

	projects, err := datasource.ListDbaasProjects(u, org.DbaasOrgID)
	if err != nil {
		log.Error("list projects failed", zap.Uint("org", org.ID), zap.Error(err))
		_ = c.Error(error2.ErrInternal.New("list projects failed"))
		return
	}

	projectRest := make([]Project, 0)
	for _, c := range projects {
		projectRest = append(projectRest, Project{
			ID:   strconv.FormatUint(c.Id, 10),
			Name: c.Name,
		})
	}

	c.JSON(http.StatusOK, ListProjectsResp{
		Total: int64(len(projectRest)),
		Items: projectRest,
	})
}
