package googlecli

import (
	"context"
	"fmt"

	"golang.org/x/oauth2/google"
	"google.golang.org/api/option"
	"google.golang.org/api/sheets/v4"
)

type SheetsCli interface {
	ReadRange(ctx context.Context, spreadsheetID string, readRange string) ([][]any, error)
}

type sheetsClient struct {
	svc *sheets.Service
}

func NewSheetsClientFromCred(ctx context.Context, cred []byte) (SheetsCli, error) {
	sheetsCred, err := google.CredentialsFromJSONWithTypeAndParams(ctx, cred, google.ServiceAccount, google.CredentialsParams{
		Scopes: []string{sheets.SpreadsheetsReadonlyScope},
	})
	if err != nil {
		return nil, fmt.Errorf("failed to get google sheets credentials: %w", err)
	}

	svc, err := sheets.NewService(ctx, option.WithCredentials(sheetsCred))
	if err != nil {
		return nil, fmt.Errorf("failed to build google sheets service: %w", err)
	}
	return &sheetsClient{svc: svc}, nil
}

func (c *sheetsClient) ReadRange(ctx context.Context, spreadsheetID string, readRange string) ([][]any, error) {
	resp, err := c.svc.Spreadsheets.Values.Get(spreadsheetID, readRange).Context(ctx).Do()
	if err != nil {
		return nil, fmt.Errorf("failed to read spreadsheet range %s: %w", readRange, err)
	}
	return resp.Values, nil
}
