package dto

import "strings"

// GitHubRegistrationStartRequest starts one server-side GitHub App manifest
// registration. returnTarget is intentionally an enum instead of an arbitrary
// return URL so provider callbacks cannot become open redirects.
type GitHubRegistrationStartRequest struct {
	ReturnTarget string `json:"returnTarget"`
}

func (request GitHubRegistrationStartRequest) Valid() bool {
	switch strings.TrimSpace(request.ReturnTarget) {
	case "web", "desktop":
		return true
	default:
		return false
	}
}

// GiteaConfigUpdateRequest configures the workspace-level Gitea integration.
// Blank secret fields keep the existing secret when the App is already
// configured; first-time configuration still requires both secrets.
type GiteaConfigUpdateRequest struct {
	InstanceURL   string `json:"instance_url"`
	APIToken      string `json:"api_token"`
	WebhookSecret string `json:"webhook_secret"`
	DisplayName   string `json:"display_name"`
}

// Valid reports whether the request has the minimum non-secret fields.
func (request GiteaConfigUpdateRequest) Valid() bool {
	return strings.TrimSpace(request.InstanceURL) != "" &&
		strings.TrimSpace(request.DisplayName) != ""
}

// GiteaConnectionCreateRequest selects one organization or owner/repository target.
type GiteaConnectionCreateRequest struct {
	Target string `json:"target"`
}

// GitHubConfigUpdateRequest configures the workspace-level GitHub App integration.
type GitHubConfigUpdateRequest struct {
	SettingsURL   string `json:"settings_url"`
	PrivateKeyPEM string `json:"private_key_pem"`
}

// GitHubSetupCompletionRequest explicitly selects the complete provider
// installation set (one to fifty) to materialize with a fresh administrator
// setup draft.
// App identity and display metadata are intentionally resolved server-side.
type GitHubSetupCompletionRequest struct {
	SetupProposalID string   `json:"setup_proposal_id"`
	InstallationID  string   `json:"installation_id,omitempty"`
	InstallationIDs []string `json:"installation_ids"`
}

// Valid reports whether both opaque/canonical selection identifiers exist.
// The store performs the stricter owner, workspace, status, TTL, and decimal
// installation-id validation before any provider request.
func (request GitHubSetupCompletionRequest) Valid() bool {
	return strings.TrimSpace(request.SetupProposalID) != "" &&
		(strings.TrimSpace(request.InstallationID) != "" || len(request.InstallationIDs) > 0)
}

// Valid reports whether the request has the minimum required fields.
func (request GitHubConfigUpdateRequest) Valid() bool {
	return strings.TrimSpace(request.SettingsURL) != "" &&
		strings.TrimSpace(request.PrivateKeyPEM) != ""
}
