package cloudconfig

import (
	"context"

	"github.com/tidbcloud/devops/entity/event"
	"github.com/tidbcloud/devops/pkg/service/cloudconfig/repo"

	"golang.org/x/sync/errgroup"
)

func (s *svc) HandleApprovalEvent(uuid string, ev *event.ApprovalEvent) error {
	errg := errgroup.Group{}

	errg.Go(func() error {
		return s.handleApprovalEventForConfigurationChange(ev)
	})

	errg.Go(func() error {
		return s.handleApprovalEventForDefaultConfigurationChange(ev)
	})

	return errg.Wait()
}

func (s *svc) handleApprovalEventForConfigurationChange(ev *event.ApprovalEvent) error {
	if ev.EventType != event.ApprovalEventTypeFinish {
		return nil
	}

	apprID := ev.ID
	changes, err := s.repo.ListConfigurationChanges(context.TODO(),
		repo.ConfigurationChangeOpts.SelectIDOnly(), // only select ID
		repo.ConfigurationChangeOpts.ApprovalIs(apprID))
	if err != nil {
		return err
	}
	if len(changes) == 0 {
		return nil
	}

	for _, chg := range changes {
		s.syncChgChan <- chg.ID
	}

	return nil
}

func (s *svc) handleApprovalEventForDefaultConfigurationChange(ev *event.ApprovalEvent) error {
	if ev.EventType != event.ApprovalEventTypeFinish {
		return nil
	}

	apprID := ev.ID
	releases, err := s.repo.ListDefaultConfigurationChangeRelease(context.TODO(),
		repo.DefaultConfigurationChangeReleaseOpts.ApprovalIs(apprID))
	if err != nil {
		return err
	}
	if len(releases) == 0 {
		return nil
	}

	for _, rel := range releases {
		s.syncDefChgRelChan <- rel.ID
	}

	return nil
}
