//go:generate ${GOBIN}/mockgen -destination task_mock.go -package=task ${GO_MODULE}/infra/lark/client/task Task
package task

import (
	"context"

	lark "github.com/larksuite/oapi-sdk-go/v3"
	larktask "github.com/larksuite/oapi-sdk-go/v3/service/task/v2"
)

type Task interface {
	GetTask(ctx context.Context, id string) (*larktask.Task, error)
	CreateTask(ctx context.Context, param CreateTaskParam) (*string, error)
	UpdateTask(ctx context.Context, id string, param UpdateTaskParam) error
	AddTaskMembers(ctx context.Context, id string, members []TaskMemberParam) error
	RemoveTaskMembers(ctx context.Context, id string, members []TaskMemberParam) error
	CompleteTask(ctx context.Context, id string) error
	DeleteTask(ctx context.Context, id string) error
	CreateSubTask(ctx context.Context, id string, param CreateTaskParam) error

	GetTaskList(ctx context.Context, id string) (*larktask.Tasklist, error)
	CreateTaskList(ctx context.Context, param CreateTaskListParam) (*string, error)
	UpdateTaskList(ctx context.Context, param UpdateTaskListParam) error
	DeleteTaskList(ctx context.Context, id string) error
	ListTaskOfTaskList(ctx context.Context, id string) ([]*larktask.TaskSummary, error)
	ListSectionsOfTaskList(ctx context.Context, id string) ([]*larktask.SectionSummary, error)

	GetSection(ctx context.Context, id string) (*larktask.Section, error)
	CreateSection(ctx context.Context, param CreateSectionParam) (*string, error)
	UpdateSection(ctx context.Context, param UpdateSectionParam) error
	DeleteSection(ctx context.Context, id string) error
	ListTaskOfSection(ctx context.Context, id string) ([]*larktask.TaskSummary, error)
}

func New(larkCli *lark.Client) Task {
	return &client{
		larkCli: larkCli,
	}
}

type client struct {
	larkCli *lark.Client
}
