package maintenancewindow

import (
	"context"
	"time"

	"google.golang.org/protobuf/types/known/timestamppb"

	tidbmgmtservicev1 "github.com/tidbcloud/tidb-management-service/api/spec/tidb_mgmt_service/v1"
	"github.com/tidbcloud/tidb-management-service/tidb-mgmt-service/domain/entity"
	"github.com/tidbcloud/tidb-management-service/utilities/bizerr"
)

func (svc *service) ListMaintenanceWindows(
	ctx context.Context,
	req *tidbmgmtservicev1.ListMaintenanceWindowsRequest,
) (*tidbmgmtservicev1.ListMaintenanceWindowsResponse, bizerr.BizError) {
	ctx, span := tracer.Start(ctx, "ListMaintenanceWindowsSvc")
	defer span.End()

	utcOffset, err := svc.accountCli.GetTimeZoneByProjectID(ctx, req.ProjectId)
	if err != nil {
		return nil, bizerr.WrapGrpcError(err, "get time zone by project id")
	}

	var maintenanceWindowWithTimeZone *entity.MaintenanceWindowWithTimeZone
	maintenanceWindow, berr := svc.mwRepo.LoadByProjectID(ctx, req.ProjectId)
	if berr != nil {
		if berr.RawErrCode() != bizerr.ErrCodeRecordNotFound {
			return nil, berr
		}

		// if not found, return default maintenance window
		maintenanceWindowWithTimeZone = buildDefaultMaintenanceWindowWithTimeZone(req.ProjectId, utcOffset)
		maintenanceWindow = buildMaintenanceWindow(maintenanceWindowWithTimeZone)
	} else {
		maintenanceWindowWithTimeZone = buildMaintenanceWindowWithTimeZone(maintenanceWindow, utcOffset)
	}

	now := time.Now()
	nextMaintenanceDateSec := getCurrentApplyTime(now, maintenanceWindow).Unix()
	maintenanceWindowWithTimeZone.NextMaintenanceDate = timestamppb.New(time.Unix(nextMaintenanceDateSec, 0))

	resp := &tidbmgmtservicev1.ListMaintenanceWindowsResponse{
		MaintenanceWindows: []*tidbmgmtservicev1.MaintenanceWindow{
			&maintenanceWindowWithTimeZone.MaintenanceWindow.MaintenanceWindow,
		},
	}
	return resp, nil
}
