package dto

// OrganizationPatchRequest patches an organization profile.
type OrganizationPatchRequest struct {
	Name *string `json:"name"`
}

// OrganizationSettingsPatchRequest patches organization settings.
type OrganizationSettingsPatchRequest struct {
	DirectoryBackend  *string                              `json:"directoryBackend"`
	AuthProvider      *string                              `json:"authProvider"`
	DirectoryProvider *string                              `json:"directoryProvider"`
	Feishu            *OrganizationFeishuSettingsPatchBody `json:"feishu"`
}

// OrganizationFeishuSettingsPatchBody patches Feishu provider settings.
type OrganizationFeishuSettingsPatchBody struct {
	TenantKey        *string `json:"tenantKey"`
	RootDepartmentID *string `json:"rootDepartmentId"`
}

// OrganizationFeishuCredentialsRequest updates Feishu enterprise credentials.
type OrganizationFeishuCredentialsRequest struct {
	AppID     string `json:"appId"`
	AppSecret string `json:"appSecret"`
}

// OrganizationInviteCreateRequest creates an organization invite.
type OrganizationInviteCreateRequest struct {
	Email                string `json:"email"`
	Role                 string `json:"role"`
	TeamID               string `json:"teamId"`
	DefaultWorkspaceRole string `json:"defaultWorkspaceRole"`
}

// OrganizationUnitCreateRequest creates an organization unit.
type OrganizationUnitCreateRequest struct {
	Name            string `json:"name"`
	Slug            string `json:"slug"`
	ParentUnitID    string `json:"parentUnitId"`
	ManagerMemberID string `json:"managerMemberId"`
}

// OrganizationUnitMemberCreateRequest adds a member to an organization unit.
type OrganizationUnitMemberCreateRequest struct {
	MemberID string `json:"memberId"`
	Primary  bool   `json:"primary"`
}

// OrganizationTeamCreateRequest creates an organization team.
type OrganizationTeamCreateRequest struct {
	Name        string `json:"name"`
	Slug        string `json:"slug"`
	Description string `json:"description"`
}

// OrganizationTeamMemberCreateRequest adds a member to an organization team.
type OrganizationTeamMemberCreateRequest struct {
	MemberID string `json:"memberId"`
	Primary  bool   `json:"primary"`
}

// OrganizationMemberPrimaryTeamUpdateRequest updates a member's primary team.
type OrganizationMemberPrimaryTeamUpdateRequest struct {
	TeamID string `json:"teamId"`
}

// OrganizationMemberRoleUpdateRequest updates a member role.
type OrganizationMemberRoleUpdateRequest struct {
	Role string `json:"role"`
}

// OrganizationMemberCreateRequest creates an organization member.
type OrganizationMemberCreateRequest struct {
	Email                string `json:"email"`
	TeamID               string `json:"teamId"`
	DefaultWorkspaceRole string `json:"defaultWorkspaceRole"`
}

// OrganizationWorkspaceCreateRequest creates a workspace owned by an organization.
type OrganizationWorkspaceCreateRequest struct {
	Name string `json:"name"`
	Slug string `json:"slug"`
}

// OrganizationWorkspaceAccessGrantRequest grants member or team access to a workspace.
type OrganizationWorkspaceAccessGrantRequest struct {
	Role string `json:"role"`
}

// OrganizationHostedModelSettingsPatchRequest patches hosted model access settings.
type OrganizationHostedModelSettingsPatchRequest struct {
	PickerVisibilityPolicy     *string   `json:"pickerVisibilityPolicy"`
	AutoAuthorizationEnabled   *bool     `json:"autoAuthorizationEnabled"`
	AutoAuthorizationMode      *string   `json:"autoAuthorizationMode"`
	AutoAuthorizationModelRefs *[]string `json:"autoAuthorizationModelRefs"`
}

// OrganizationWorkspaceHostedModelAuthorizationPutRequest updates a workspace's hosted model access.
type OrganizationWorkspaceHostedModelAuthorizationPutRequest struct {
	AuthorizationMode string   `json:"authorizationMode"`
	SelectedModelRefs []string `json:"selectedModelRefs"`
}

// OrganizationAgentCreateRequest creates an organization-scoped agent template.
type OrganizationAgentCreateRequest struct {
	Name            string `json:"name"`
	DisplayName     string `json:"displayName"`
	AvatarURL       string `json:"avatarUrl"`
	Description     string `json:"description"`
	Runtime         string `json:"runtime"`
	Model           string `json:"model"`
	ReasoningEffort string `json:"reasoningEffort"`
}

// OrganizationAgentUpdateRequest patches an organization-scoped agent template.
type OrganizationAgentUpdateRequest struct {
	DisplayName     *string        `json:"displayName"`
	AvatarURL       OptionalString `json:"avatarUrl"`
	Description     OptionalString `json:"description"`
	Runtime         *string        `json:"runtime"`
	Model           OptionalString `json:"model"`
	ReasoningEffort OptionalString `json:"reasoningEffort"`
	Status          *string        `json:"status"`
}

type OrganizationProviderModelInput struct {
	Name string `json:"name"`
	ID   string `json:"id"`
}

type OrganizationProviderEndpointsInput struct {
	MessagesBaseURL   string `json:"messagesBaseUrl"`
	ResponsesBaseURL  string `json:"responsesBaseUrl"`
	EmbeddingsBaseURL string `json:"embeddingsBaseUrl"`
}

type OrganizationProviderCapabilitiesInput struct {
	OpenAICompatible    bool `json:"openaiCompatible"`
	AnthropicCompatible bool `json:"anthropicCompatible"`
	ResponsesCompatible bool `json:"responsesCompatible"`
	EmbeddingCompatible bool `json:"embeddingCompatible"`
}

type OrganizationProviderTokenConfigInput struct {
	Role                string   `json:"role"`
	BaseURL             string   `json:"baseUrl"`
	Mode                string   `json:"mode"`
	BackendName         string   `json:"backendName"`
	BackendID           int      `json:"backendId"`
	Active              *bool    `json:"active"`
	Weight              float64  `json:"weight"`
	WeightDiffThreshold float64  `json:"weightDiffThreshold"`
	AdaptiveWeights     bool     `json:"adaptiveWeights"`
	RequiresOAuthBeta   bool     `json:"requiresOAuthBeta"`
	AllowedAPIKeys      []string `json:"allowedApiKeys"`
	CustomPrompt        string   `json:"customPrompt"`
	CustomPromptModels  []string `json:"customPromptModels"`
}

type OrganizationProviderTokenSecretInput struct {
	Token           string `json:"token"`
	APIKey          string `json:"apiKey"`
	AuthToken       string `json:"authToken"`
	AuthJSONContent string `json:"authJsonContent"`
}

// OrganizationProviderCreateRequest creates an org-managed provider.
type OrganizationProviderCreateRequest struct {
	Name         string                                 `json:"name"`
	Description  string                                 `json:"description"`
	DriverKind   string                                 `json:"driverKind"`
	ProviderType string                                 `json:"providerType"`
	BaseURL      string                                 `json:"baseUrl"`
	Endpoints    OrganizationProviderEndpointsInput     `json:"endpoints"`
	Capabilities *OrganizationProviderCapabilitiesInput `json:"capabilities"`
	Models       []OrganizationProviderModelInput       `json:"models"`
}

// OrganizationProviderUpdateRequest patches an org-managed provider.
type OrganizationProviderUpdateRequest struct {
	Name         *string                                `json:"name"`
	Description  *string                                `json:"description"`
	DriverKind   *string                                `json:"driverKind"`
	ProviderType *string                                `json:"providerType"`
	BaseURL      *string                                `json:"baseUrl"`
	Endpoints    *OrganizationProviderEndpointsInput    `json:"endpoints"`
	Capabilities *OrganizationProviderCapabilitiesInput `json:"capabilities"`
	Models       *[]OrganizationProviderModelInput      `json:"models"`
	Status       *string                                `json:"status"`
}

// OrganizationProviderTokenCreateRequest creates an org-managed provider token.
type OrganizationProviderTokenCreateRequest struct {
	Label  string                               `json:"label"`
	Token  string                               `json:"token"`
	Config OrganizationProviderTokenConfigInput `json:"config"`
	Secret OrganizationProviderTokenSecretInput `json:"secret"`
}

type OrganizationProviderCodexAuthSnapshot struct {
	Source          string   `json:"source"`
	Name            string   `json:"name,omitempty"`
	BackendID       int      `json:"backendId,omitempty"`
	BaseURL         string   `json:"baseUrl"`
	Mode            string   `json:"mode"`
	Active          bool     `json:"active"`
	Weight          float64  `json:"weight"`
	AllowedAPIKeys  []string `json:"allowedApiKeys,omitempty"`
	HasAccessToken  bool     `json:"hasAccessToken"`
	HasRefreshToken bool     `json:"hasRefreshToken"`
	AccessToken     string   `json:"accessToken,omitempty"`
	APIKey          string   `json:"apiKey,omitempty"`
	AccountID       string   `json:"accountId,omitempty"`
	LastRefreshAt   string   `json:"lastRefreshAt,omitempty"`
	LastStatus      int      `json:"lastStatus,omitempty"`
	LastError       string   `json:"lastError,omitempty"`
}

type OrganizationProviderCodexAuthResponse struct {
	Configured bool                                    `json:"configured"`
	Auth       []OrganizationProviderCodexAuthSnapshot `json:"auth"`
	TotalCount int                                     `json:"totalCount"`
}

type OrganizationProviderCodexAuthRefreshRequest struct {
	Source string `json:"source"`
}

type OrganizationProviderCodexAuthRefreshResult struct {
	Source    string `json:"source"`
	Refreshed bool   `json:"refreshed"`
	Error     string `json:"error,omitempty"`
}

type OrganizationProviderCodexAuthRefreshResponse struct {
	Results []OrganizationProviderCodexAuthRefreshResult `json:"results"`
}

type OrganizationLLMProxyKeyCreateRequest struct {
	Label string `json:"label"`
}

type OrganizationLLMQuotaPolicyUpsertRequest struct {
	DailyQuotaUSD float64 `json:"dailyQuotaUsd"`
}

type OrganizationProviderRouteCreateRequest struct {
	Vendor      string                           `json:"vendor"`
	DisplayName string                           `json:"displayName"`
	Models      []OrganizationProviderModelInput `json:"models"`
}

type OrganizationProviderRouteUpdateRequest struct {
	Vendor      *string                           `json:"vendor"`
	DisplayName *string                           `json:"displayName"`
	Models      *[]OrganizationProviderModelInput `json:"models"`
}

type OrganizationProviderRouteGroupCreateRequest struct {
	Models       []string `json:"models"`
	ProviderRefs []string `json:"providerRefs"`
	Strategy     string   `json:"strategy"`
	Priority     int      `json:"priority"`
}

type OrganizationProviderRouteGroupUpdateRequest struct {
	Models       *[]string `json:"models"`
	ProviderRefs *[]string `json:"providerRefs"`
	Strategy     *string   `json:"strategy"`
	Priority     *int      `json:"priority"`
}
