package provider

import (
	"context"
	"fmt"
	"net/http"
	"strings"

	"github.com/tidbcloud/AgentTeam/internal/api"
	"github.com/tidbcloud/AgentTeam/internal/store/app"
	providerstore "github.com/tidbcloud/AgentTeam/internal/store/provider"
)

func githubNoStoreOK(body any) api.Response {
	response := api.OK(body)
	response.Headers = make(http.Header)
	response.Headers.Set("Cache-Control", "no-store")
	return response
}

type githubVerifiedSetupResult struct {
	mode     string
	config   providerstore.GitHubAppConfigView
	proposal app.GitHubSetupProposalView
}

func (handler *GitHubHandler) githubAppSetupModeForUser(ctx context.Context, userID string, workspaceID string) (string, error) {
	if handler.adminStore == nil {
		return "", fmt.Errorf("github setup store is not configured")
	}
	mode, err := handler.adminStore.GitHubAppSetupModeForUser(ctx, userID, workspaceID)
	if err != nil {
		return "", err
	}
	switch strings.TrimSpace(mode) {
	case app.GitHubAppSetupModeAdmin, app.GitHubAppSetupModeRequester:
		return strings.TrimSpace(mode), nil
	default:
		return "", fmt.Errorf("unsupported github setup mode %q", mode)
	}
}

func (handler *GitHubHandler) persistVerifiedGitHubSetup(
	ctx context.Context,
	mode string,
	userID string,
	workspaceID string,
	params providerstore.UpsertGitHubAppConfigParams,
) (githubVerifiedSetupResult, error) {
	if handler.adminStore == nil {
		return githubVerifiedSetupResult{}, fmt.Errorf("github setup store is not configured")
	}
	switch strings.TrimSpace(mode) {
	case app.GitHubAppSetupModeAdmin:
		config, err := handler.adminStore.FinalizeGitHubAppSetupForWorkspaceAdmin(ctx, userID, workspaceID, params)
		if err != nil {
			return githubVerifiedSetupResult{}, err
		}
		return githubVerifiedSetupResult{mode: app.GitHubAppSetupModeAdmin, config: config}, nil
	case app.GitHubAppSetupModeRequester:
		proposal, err := handler.adminStore.SaveVerifiedGitHubSetupDraftForRequester(ctx, userID, workspaceID, params)
		if err != nil {
			return githubVerifiedSetupResult{}, err
		}
		return githubVerifiedSetupResult{mode: app.GitHubAppSetupModeRequester, proposal: proposal}, nil
	default:
		return githubVerifiedSetupResult{}, fmt.Errorf("unsupported github setup mode %q", mode)
	}
}
