package main

import (
	"context"

	tidb_mgmt_servicev1 "github.com/tidbcloud/tidb-management-service/api/spec/tidb_mgmt_service/v1"
	"google.golang.org/protobuf/types/known/emptypb"

	"google.golang.org/grpc"
)

// LocalGrpcService mock tidb-mgmt-service response
// only need to implement ListClusters and ShowComponentNodeInfo
type LocalGrpcService struct {
	StartTimestamp int64
}

func (l LocalGrpcService) ListClusters(ctx context.Context, in *tidb_mgmt_servicev1.ListClustersRequest, opts ...grpc.CallOption) (*tidb_mgmt_servicev1.ListClustersResponse, error) {
	resp := &tidb_mgmt_servicev1.ListClustersResponse{}
	resp.Clusters = append(resp.Clusters, buildClusters()...)
	return resp, nil
}

func (l LocalGrpcService) ShowComponentNodeInfo(ctx context.Context, in *tidb_mgmt_servicev1.ShowComponentNodeInfoRequest, opts ...grpc.CallOption) (*tidb_mgmt_servicev1.ShowComponentNodeInfoResponse, error) {
	resp := &tidb_mgmt_servicev1.ShowComponentNodeInfoResponse{}
	resp.ComponentNodeInfo = buildScalingComponentInfo()
	return resp, nil
}

// Subsequent methods do not need to be implemented

func (l LocalGrpcService) CountClusters(ctx context.Context, in *tidb_mgmt_servicev1.CountClustersRequest, opts ...grpc.CallOption) (*tidb_mgmt_servicev1.CountClustersResponse, error) {
	//TODO implement me
	panic("implement me")
}

func (l LocalGrpcService) CleanClusters(ctx context.Context, in *tidb_mgmt_servicev1.CleanClustersRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
	//TODO implement me
	panic("implement me")
}

func (l LocalGrpcService) CleanProjectResource(ctx context.Context, in *tidb_mgmt_servicev1.CleanProjectResourceRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
	//TODO implement me
	panic("implement me")
}

func (l LocalGrpcService) CleanOrganizationResource(ctx context.Context, in *tidb_mgmt_servicev1.CleanOrganizationResourceRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
	//TODO implement me
	panic("implement me")
}

func (l LocalGrpcService) ApplyCluster(ctx context.Context, in *tidb_mgmt_servicev1.ApplyClusterRequest, opts ...grpc.CallOption) (*tidb_mgmt_servicev1.Cluster, error) {
	//TODO implement me
	panic("implement me")
}

func (l LocalGrpcService) RestoreDedicatedCluster(ctx context.Context, in *tidb_mgmt_servicev1.RestoreDedicatedClusterRequest, opts ...grpc.CallOption) (*tidb_mgmt_servicev1.Cluster, error) {
	//TODO implement me
	panic("implement me")
}

func (l LocalGrpcService) RestoreServerlessCluster(ctx context.Context, in *tidb_mgmt_servicev1.RestoreServerlessClusterRequest, opts ...grpc.CallOption) (*tidb_mgmt_servicev1.Cluster, error) {
	//TODO implement me
	panic("implement me")
}

func (l LocalGrpcService) DeleteCluster(ctx context.Context, in *tidb_mgmt_servicev1.DeleteClusterRequest, opts ...grpc.CallOption) (*tidb_mgmt_servicev1.Cluster, error) {
	//TODO implement me
	panic("implement me")
}

func (l LocalGrpcService) ModifyClusterVolume(ctx context.Context, in *tidb_mgmt_servicev1.ModifyClusterVolumeRequest, opts ...grpc.CallOption) (*tidb_mgmt_servicev1.Cluster, error) {
	//TODO implement me
	panic("implement me")
}

func (l LocalGrpcService) ScaleClusterPdComponent(ctx context.Context, in *tidb_mgmt_servicev1.ScaleClusterPdComponentRequest, opts ...grpc.CallOption) (*tidb_mgmt_servicev1.Cluster, error) {
	//TODO implement me
	panic("implement me")
}

func (l LocalGrpcService) ScaleClusterTiProxyComponent(ctx context.Context, in *tidb_mgmt_servicev1.ScaleClusterTiProxyComponentRequest, opts ...grpc.CallOption) (*tidb_mgmt_servicev1.Cluster, error) {
	//TODO implement me
	panic("implement me")
}

func (l LocalGrpcService) ScaleClusterComponents(ctx context.Context, in *tidb_mgmt_servicev1.ScaleClusterComponentsRequest, opts ...grpc.CallOption) (*tidb_mgmt_servicev1.Cluster, error) {
	//TODO implement me
	panic("implement me")
}

func (l LocalGrpcService) CreateClusterWithClusterConfiguration(ctx context.Context, in *tidb_mgmt_servicev1.CreateClusterWithClusterConfigurationRequest, opts ...grpc.CallOption) (*tidb_mgmt_servicev1.Cluster, error) {
	//TODO implement me
	panic("implement me")
}

func (l LocalGrpcService) CountBillableClusters(ctx context.Context, in *tidb_mgmt_servicev1.CountBillableClustersRequest, opts ...grpc.CallOption) (*tidb_mgmt_servicev1.CountBillableClustersResponse, error) {
	//TODO implement me
	panic("implement me")
}

func (l LocalGrpcService) UpdateServerlessRegionalClusterAnnotations(ctx context.Context, in *tidb_mgmt_servicev1.UpdateServerlessRegionalClusterAnnotationsRequest, opts ...grpc.CallOption) (*tidb_mgmt_servicev1.Cluster, error) {
	//TODO implement me
	panic("implement me")
}
