package pierre

import (
	"context"
	"io"

	"git.schreifuchs.ch/schreifuchs/pierre-bot/internal/chatter"
)

// Service holds the core collaborators and configuration for Pierre.
// The order of the fields is intentional: configuration fields first (used
// during initialization) followed by the adapters. This prevents accidental
// changes to the serialized layout if encoding/gob or encoding/json is used
// elsewhere in the future.
type Service struct {
	maxChunkSize    int
	guidelines      []string
	disableComments bool
	git             GitAdapter
	chat            ChatAdapter
}

func New(chat ChatAdapter, git GitAdapter, maxChunkSize int, guidelines []string, disableComments bool) *Service {
	return &Service{
		git:             git,
		chat:            chat,
		maxChunkSize:    maxChunkSize,
		guidelines:      guidelines,
		disableComments: disableComments,
	}
}

type GitAdapter interface {
	GetDiff(ctx context.Context, owner, repo string, prID int) (io.ReadCloser, error)
	AddComment(ctx context.Context, owner, repo string, prID int, comment Comment) error
	GetFileContent(ctx context.Context, owner, repo, path, ref string) (string, error)
	GetPRHeadSHA(ctx context.Context, owner, repo string, prID int) (string, error)
}

type ChatAdapter interface {
	GenerateStructured(ctx context.Context, messages []chatter.Message, target interface{}) error
	GetProviderName() string
}
