package repo

import (
	"context"
	"encoding/json"
	"fmt"

	jiraent "github.com/tidbcloud/devops/entity/jira"
	"github.com/tidbcloud/devops/pkg/infra/asset"
)

const (
	TimelineSummaryFilename = "timeline_summary.json"
)

type IssueTimelineSummaryDriver interface {
	Save(ctx context.Context, key string, summary *jiraent.IssueTimelineSummary) error
	Load(ctx context.Context, key string) (*jiraent.IssueTimelineSummary, error)
	Delete(ctx context.Context, key string) error
}

type itsD driver

func (d *itsD) Save(ctx context.Context, key string, summary *jiraent.IssueTimelineSummary) error {
	bucket, err := d.assetOfIssue(key).Bucket(ctx)
	if err != nil {
		return err
	}
	defer bucket.Close()

	data, err := json.Marshal(summary)
	if err != nil {
		return fmt.Errorf("marshal data failed: %w", err)
	}

	err = bucket.WriteAll(ctx, TimelineSummaryFilename, data, nil)
	if err != nil {
		return fmt.Errorf("write to bucket failed: %w", err)
	}

	return nil
}

func (d *itsD) Load(ctx context.Context, key string) (*jiraent.IssueTimelineSummary, error) {
	bucket, err := d.assetOfIssue(key).Bucket(ctx)
	if err != nil {
		return nil, err
	}
	defer bucket.Close()

	data, err := bucket.ReadAll(ctx, TimelineSummaryFilename)
	if err != nil {
		return nil, fmt.Errorf("read from bucket failed: %w", err)
	}

	summary := &jiraent.IssueTimelineSummary{}
	err = json.Unmarshal(data, summary)
	if err != nil {
		return nil, fmt.Errorf("unmarshal data failed: %w", err)
	}

	return summary, nil
}

func (d *itsD) Delete(ctx context.Context, key string) error {
	bucket, err := d.assetOfIssue(key).Bucket(ctx)
	if err != nil {
		return err
	}
	defer bucket.Close()

	err = bucket.Delete(ctx, TimelineSummaryFilename)
	if err != nil {
		return fmt.Errorf("delete from bucket failed: %w", err)
	}

	return nil
}

func (d *itsD) assetOfIssue(issueKey string) asset.Asset {
	return d.asset.Sub("issue_timeline_summary", issueKey)
}
