package agent

import (
	"context"

	"github.com/grpc-ecosystem/grpc-gateway/v2/runtime"
	"go.uber.org/dig"
	"google.golang.org/grpc"

	agentapi "github.com/tidbcloud/aisupport/packages/sdk-go/contracts/api/agent-gateway/agent/v1"
	"github.com/tidbcloud/aisupport/packages/sdk-go/infra/rpcserver"
	"github.com/tidbcloud/aisupport/services/agent-gateway/internal/app"
	serviceapi "github.com/tidbcloud/aisupport/services/agent-gateway/internal/services/agent/api"
)

type HandlerParam struct {
	dig.In

	Service serviceapi.Management
}

type Handler struct {
	agentapi.UnimplementedAgentServiceServer

	service serviceapi.Management
}

func NewHandler(param HandlerParam) app.HandlerResult {
	handler := &Handler{service: param.Service}
	return app.HandlerResult{Handler: handler, GatewayHandler: handler}
}

func (h *Handler) Name() string {
	return "AgentService"
}

func (h *Handler) RegisterRPC(server *grpc.Server) error {
	agentapi.RegisterAgentServiceServer(server, h)
	return nil
}

func (h *Handler) RegisterGateway(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error {
	return agentapi.RegisterAgentServiceHandler(ctx, mux, conn)
}

func (h *Handler) ListAgents(ctx context.Context, req *agentapi.ListAgentsRequest) (*agentapi.ListAgentsResponse, error) {
	return h.service.ListAgents(ctx, req)
}

func (h *Handler) ListProjects(ctx context.Context, req *agentapi.ListProjectsRequest) (*agentapi.ListProjectsResponse, error) {
	return h.service.ListProjects(ctx, req)
}

func (h *Handler) CreateProject(ctx context.Context, req *agentapi.CreateProjectRequest) (*agentapi.CreateProjectResponse, error) {
	return h.service.CreateProject(ctx, req)
}

func (h *Handler) DeleteProject(ctx context.Context, req *agentapi.DeleteProjectRequest) (*agentapi.DeleteProjectResponse, error) {
	return h.service.DeleteProject(ctx, req)
}

func (h *Handler) ListProjectEntries(ctx context.Context, req *agentapi.ListProjectEntriesRequest) (*agentapi.ListProjectEntriesResponse, error) {
	return h.service.ListProjectEntries(ctx, req)
}

func (h *Handler) GetProjectFile(ctx context.Context, req *agentapi.GetProjectFileRequest) (*agentapi.GetProjectFileResponse, error) {
	return h.service.GetProjectFile(ctx, req)
}

func (h *Handler) CreateProjectEntry(ctx context.Context, req *agentapi.CreateProjectEntryRequest) (*agentapi.CreateProjectEntryResponse, error) {
	return h.service.CreateProjectEntry(ctx, req)
}

func (h *Handler) UpdateProjectFile(ctx context.Context, req *agentapi.UpdateProjectFileRequest) (*agentapi.UpdateProjectFileResponse, error) {
	return h.service.UpdateProjectFile(ctx, req)
}

func (h *Handler) MoveProjectEntry(ctx context.Context, req *agentapi.MoveProjectEntryRequest) (*agentapi.MoveProjectEntryResponse, error) {
	return h.service.MoveProjectEntry(ctx, req)
}

func (h *Handler) DeleteProjectEntry(ctx context.Context, req *agentapi.DeleteProjectEntryRequest) (*agentapi.DeleteProjectEntryResponse, error) {
	return h.service.DeleteProjectEntry(ctx, req)
}

var _ agentapi.AgentServiceServer = (*Handler)(nil)
var _ rpcserver.RPCHandler = (*Handler)(nil)
var _ rpcserver.GatewayHandler = (*Handler)(nil)

func (h *Handler) ListAPIProxyRoutes(ctx context.Context, req *agentapi.ListAPIProxyRoutesRequest) (*agentapi.ListAPIProxyRoutesResponse, error) {
	return h.service.ListAPIProxyRoutes(ctx, req)
}

func (h *Handler) ListSecretStoreSecrets(ctx context.Context, req *agentapi.ListSecretStoreSecretsRequest) (*agentapi.ListSecretStoreSecretsResponse, error) {
	return h.service.ListSecretStoreSecrets(ctx, req)
}
