package onescli

import (
	"context"
	"fmt"
	"sync"

	"github.com/tidbcloud/devops/pkg/infra/clients/onescli/api"
)

type IssueStatusCache struct {
	mu           sync.RWMutex
	nameToStatus map[string]*api.IssueStatus
	client       *client
}

func (c *IssueStatusCache) GetByName(ctx context.Context, name string) (*api.IssueStatus, error) {
	c.mu.RLock()
	if c.nameToStatus != nil {
		status, ok := c.nameToStatus[name]
		c.mu.RUnlock()
		if ok {
			return status, nil
		}

		return nil, fmt.Errorf("issue_status %s not found", name)
	}
	c.mu.RUnlock()

	c.mu.Lock()
	defer c.mu.Unlock()

	if c.nameToStatus == nil {
		if err := c.sync(ctx); err != nil {
			return nil, err
		}
	}

	if status, ok := c.nameToStatus[name]; ok {
		return status, nil
	}

	return nil, fmt.Errorf("issue_status %s not found", name)
}

func (c *IssueStatusCache) sync(ctx context.Context) error {
	statuses, err := c.client.ListIssueStatuses(ctx)
	if err != nil {
		return err
	}

	if c.nameToStatus == nil {
		c.nameToStatus = make(map[string]*api.IssueStatus, len(statuses))
	}

	for _, status := range statuses {
		c.nameToStatus[status.Name] = status
	}

	return nil
}
