package collaboration

import (
	"encoding/json"

	baseapi "github.com/tidbcloud/aisupport/packages/sdk-go/contracts/api/base"
	collabent "github.com/tidbcloud/aisupport/packages/sdk-go/contracts/entity/ticket-manager/collaboration"
)

type LinkLarkGroupRequest struct {
	GroupID string `json:"group_id" binding:"required"`
}

type CreateLarkGroupRequest struct {
	GroupName        string   `json:"group_name" binding:"required"`
	GroupDescription string   `json:"group_description,omitempty"`
	Owner            string   `json:"owner,omitempty"`
	Members          []string `json:"members,omitempty"`
}

type CreateResourceForLarkGroupRequest struct {
	LinkGroup   *LinkLarkGroupRequest   `json:"link_group,omitempty" binding:"required_without=CreateGroup,excluded_with=CreateGroup"`
	CreateGroup *CreateLarkGroupRequest `json:"create_group,omitempty" binding:"required_without=LinkGroup,excluded_with=LinkGroup"`
}

type CreateResourceForLarkMeetingRequest struct {
	MeetingID string `json:"meeting_id" binding:"required"`
}

type CreateResourceForLarkDocumentRequest struct {
	DocID  string `json:"doc_id" binding:"required"`
	IsWiki bool   `json:"is_wiki"`
	Owner  string `json:"owner" binding:"required"`
}

type CreateResourceRequest struct {
	LarkGroup    *CreateResourceForLarkGroupRequest    `json:"lark_group,omitempty" binding:"required_without_all=LarkMeeting LarkDocument,excluded_with=LarkMeeting LarkDocument"`
	LarkMeeting  *CreateResourceForLarkMeetingRequest  `json:"lark_meeting,omitempty" binding:"required_without_all=LarkGroup LarkDocument,excluded_with=LarkGroup LarkDocument"`
	LarkDocument *CreateResourceForLarkDocumentRequest `json:"lark_document,omitempty" binding:"required_without_all=LarkGroup LarkMeeting,excluded_with=LarkGroup LarkMeeting"`
}

type CreateResourceResponse struct {
	*baseapi.BaseResponse

	Resource *collabent.Resource `json:"resource"`
}

type GetResourceResponse struct {
	*baseapi.BaseResponse

	Resource *collabent.Resource `json:"resource"`
}

type UpdateResourceRequest struct {
	Name     *string         `json:"name,omitempty"`
	Link     *string         `json:"link,omitempty"`
	Metadata json.RawMessage `json:"metadata,omitempty" swaggertype:"object"`
}

type UpdateResourceResponse struct {
	*baseapi.BaseResponse

	Resource *collabent.Resource `json:"resource"`
}

type ListResourcesRequest struct {
	baseapi.PageRequest

	TicketID         uint64             `form:"ticket_id" json:"ticket_id"`
	ResourceType     collabent.Type     `form:"type" json:"type"`
	ResourceProvider collabent.Provider `form:"provider" json:"provider"`
	ResourceID       string             `form:"resource_id" json:"resource_id"`
	ResourceName     string             `form:"resource_name" json:"resource_name"`
}

type ListResourcesResponse struct {
	*baseapi.BaseResponse

	Resources []*collabent.Resource `json:"resources"`
	Total     int64                 `json:"total"`
}
