package org

import (
	"net/http"
	"strings"

	"github.com/tidbcloud/AgentTeam/internal/api"
	"github.com/tidbcloud/AgentTeam/internal/api/dto"
	"github.com/tidbcloud/AgentTeam/internal/api/dto/converter"
)

// List handles GET /api/v1/orgs/:orgId/teams.
// It returns all teams for the specified organization.
func (handler *TeamHandler) List(r api.AuthenticatedRequest) (api.Response, error) {
	orgs, ok := handler.organizationProvider()
	if !ok {
		return api.Response{}, api.NewHTTPError(http.StatusNotFound, "Organization provider not installed")
	}

	organizationID := strings.TrimSpace(r.Gin.Param("orgId"))
	if organizationID == "" {
		return api.Response{}, api.NewHTTPError(http.StatusBadRequest, "orgId is required")
	}

	teams, err := orgs.ListOrganizationTeamsForUser(r.Context(), r.UserID(), organizationID)
	if err != nil {
		return api.Response{}, err
	}
	return api.OK(converter.ToOrgTeamViews(teams)), nil
}

// Create handles POST /api/v1/orgs/:orgId/teams.
// It creates a new team within the specified organization.
func (handler *TeamHandler) Create(r api.AuthenticatedJSON[dto.OrganizationTeamCreateRequest]) (api.Response, error) {
	orgs, ok := handler.organizationProvider()
	if !ok {
		return api.Response{}, api.NewHTTPError(http.StatusNotFound, "Organization provider not installed")
	}

	organizationID := strings.TrimSpace(r.Gin.Param("orgId"))
	if organizationID == "" {
		return api.Response{}, api.NewHTTPError(http.StatusBadRequest, "orgId is required")
	}

	request := r.Body

	team, err := orgs.CreateOrganizationTeamForUser(r.Context(), r.UserID(), organizationID, request.Name, request.Slug, request.Description)
	if err != nil {
		return api.Response{}, err
	}
	return api.OK(converter.ToOrgTeamView(team)), nil
}

// ListMembers handles GET /api/v1/orgs/:orgId/teams/:teamId/members.
// It returns all members belonging to the specified team.
func (handler *TeamHandler) ListMembers(r api.AuthenticatedRequest) (api.Response, error) {
	orgs, ok := handler.organizationProvider()
	if !ok {
		return api.Response{}, api.NewHTTPError(http.StatusNotFound, "Organization provider not installed")
	}

	organizationID := strings.TrimSpace(r.Gin.Param("orgId"))
	teamID := strings.TrimSpace(r.Gin.Param("teamId"))
	if organizationID == "" || teamID == "" {
		return api.Response{}, api.NewHTTPError(http.StatusBadRequest, "Invalid request")
	}

	members, err := orgs.ListOrganizationTeamMembersForUser(r.Context(), r.UserID(), organizationID, teamID)
	if err != nil {
		return api.Response{}, err
	}
	return api.OK(converter.ToOrgTeamMemberViews(members)), nil
}

// CreateMember handles POST /api/v1/orgs/:orgId/teams/:teamId/members.
// It adds a member to the specified team.
func (handler *TeamHandler) CreateMember(r api.AuthenticatedJSON[dto.OrganizationTeamMemberCreateRequest]) (api.Response, error) {
	orgs, ok := handler.organizationProvider()
	if !ok {
		return api.Response{}, api.NewHTTPError(http.StatusNotFound, "Organization provider not installed")
	}

	organizationID := strings.TrimSpace(r.Gin.Param("orgId"))
	teamID := strings.TrimSpace(r.Gin.Param("teamId"))
	if organizationID == "" || teamID == "" {
		return api.Response{}, api.NewHTTPError(http.StatusBadRequest, "Invalid request")
	}

	request := r.Body

	member, err := orgs.AddOrganizationTeamMemberForUser(r.Context(), r.UserID(), organizationID, teamID, addOrganizationTeamMemberParams(request))
	if err != nil {
		return api.Response{}, err
	}
	return api.OK(converter.ToOrgTeamMemberView(member)), nil
}

// RemoveMember handles DELETE /api/v1/orgs/:orgId/teams/:teamId/members/:memberId.
// It removes a member from the specified team.
func (handler *TeamHandler) RemoveMember(r api.AuthenticatedRequest) (api.Response, error) {
	orgs, ok := handler.organizationProvider()
	if !ok {
		return api.Response{}, api.NewHTTPError(http.StatusNotFound, "Organization provider not installed")
	}

	organizationID := strings.TrimSpace(r.Gin.Param("orgId"))
	teamID := strings.TrimSpace(r.Gin.Param("teamId"))
	memberID := strings.TrimSpace(r.Gin.Param("memberId"))
	if organizationID == "" || teamID == "" || memberID == "" {
		return api.Response{}, api.NewHTTPError(http.StatusBadRequest, "Invalid request")
	}

	if err := orgs.RemoveOrganizationTeamMemberForUser(r.Context(), r.UserID(), organizationID, teamID, memberID); err != nil {
		return api.Response{}, err
	}
	return api.OK(dto.EmptyResponse{}), nil
}
