package oldreport

import (
	"context"
	"time"

	"github.com/pingcap/log"
	"go.uber.org/zap"

	"github.com/pingcap-inc/clinic/pkg/config"
	"github.com/pingcap-inc/clinic/pkg/o11y"
	"github.com/pingcap-inc/clinic/pkg/o11y/urls"
	"github.com/pingcap-inc/clinic/pkg/rbac"
	"github.com/pingcap-inc/clinic/pkg/resource_limit"
	task_manager "github.com/pingcap-inc/clinic/pkg/task_manager"
	"github.com/pingcap-inc/clinic/pkg/trafficjobclient"
)

type ReportService struct {
	cfg          *config.Config
	rbac         *rbac.AuthCasbin
	taskManager  *task_manager.TaskManagerClient
	quotalimiter resource_limit.IQuotaLimiter
	tjStore      *trafficjobclient.TrafficComparisonReportStorage
	o11yCli      *o11y.Client
	urlsResolver *urls.ClusterURLsResolver
}

func NewReportService(cfg *config.Config, rbac *rbac.AuthCasbin, taskManagerCli *task_manager.TaskManagerClient, quotalimiter resource_limit.IQuotaLimiter) *ReportService {
	var o11yCli *o11y.Client
	if cfg.EnableO11yCanary {
		var err error
		o11ySharedOpts := []o11y.Option{
			o11y.TimeoutOption(40 * time.Second),
			o11y.MaxIdleConnOption(10),
		}
		o11yCli, err = o11y.New(
			cfg.CentralO11yConfig.GSEndpoint,
			cfg.CentralO11yConfig.DSEndpointTPL,
			cfg.CentralO11yConfig.ClientId,
			cfg.CentralO11yConfig.ClientSecret,
			cfg.CentralO11yConfig.Env,
			append(o11ySharedOpts, o11y.ByocDSEndpointOption(cfg.CentralO11yConfig.ByocDSEndpoint))...,
		)
		if err != nil {
			log.Fatal("failed to create o11y cli for ReportService", zap.Error(err))
		}
	}
	return &ReportService{
		cfg:          cfg,
		rbac:         rbac,
		taskManager:  taskManagerCli,
		quotalimiter: quotalimiter,
		tjStore:      trafficjobclient.NewTrafficComparisonReportStorage(context.Background()),
		o11yCli:      o11yCli,
		urlsResolver: urls.NewClusterURLsResolver(o11yCli),
	}
}
