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"
)

// Get handles GET /api/v1/orgs/:orgId/settings.
// It retrieves the settings for the specified organization.
func (handler *SettingsHandler) Get(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")
	}

	settings, err := orgs.GetOrganizationSettingsForUser(r.Context(), r.UserID(), organizationID)
	if err != nil {
		return api.Response{}, err
	}
	return api.OK(converter.ToOrgSettingsView(settings)), nil
}

// DirectorySyncRunGet handles GET /api/v1/orgs/:orgId/directory-sync-runs/:syncRunId.
// It retrieves details of a specific directory sync run for the organization.
func (handler *SettingsHandler) DirectorySyncRunGet(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"))
	syncRunID := strings.TrimSpace(r.Gin.Param("syncRunId"))
	if organizationID == "" || syncRunID == "" {
		return api.Response{}, api.NewHTTPError(http.StatusBadRequest, "Invalid request")
	}

	detail, err := orgs.GetOrganizationDirectorySyncRunForUser(r.Context(), r.UserID(), organizationID, syncRunID)
	if err != nil {
		return api.Response{}, err
	}
	return api.OK(converter.ToOrgDirectorySyncRunDetailView(detail)), nil
}

// Patch handles PATCH /api/v1/orgs/:orgId/settings.
// It partially updates the settings for the specified organization.
func (handler *SettingsHandler) Patch(r api.AuthenticatedJSON[dto.OrganizationSettingsPatchRequest]) (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

	params := updateOrganizationSettingsParams(request)

	settings, err := orgs.PatchOrganizationSettingsForUser(
		r.Context(),
		r.UserID(),
		organizationID,
		params,
	)
	if err != nil {
		return api.Response{}, err
	}
	return api.OK(converter.ToOrgSettingsView(settings)), nil
}
