package automation

import (
	"context"
	"fmt"
	"strings"

	"gorm.io/gorm"
	"gorm.io/gorm/clause"
)

func (s *Store) ListPinnedRepos(ctx context.Context, workspaceID string, principalID string, page int, perPage int) ([]AutomationPinnedRepo, error) {
	if err := s.ensureDB(); err != nil {
		return nil, err
	}
	offset := (page - 1) * perPage
	var rows []AutomationPinnedRepo
	err := s.db.WithContext(ctx).
		Where("workspace_id = ? AND principal_id = ?", strings.TrimSpace(workspaceID), strings.TrimSpace(principalID)).
		Order("updated_at DESC").Order("owner ASC").Order("repo ASC").Limit(perPage).Offset(offset).Find(&rows).Error
	if err != nil {
		return nil, fmt.Errorf("list pinned automation repos: %w", err)
	}
	return rows, nil
}

func (s *Store) UpsertPinnedRepo(ctx context.Context, pin AutomationPinnedRepo) (AutomationPinnedRepo, error) {
	if err := s.ensureDB(); err != nil {
		return AutomationPinnedRepo{}, err
	}
	err := s.db.WithContext(ctx).Clauses(clause.OnConflict{
		Columns:   []clause.Column{{Name: "workspace_id"}, {Name: "principal_id"}, {Name: "owner"}, {Name: "repo"}},
		DoUpdates: clause.AssignmentColumns([]string{"updated_at"}),
	}).Create(&pin).Error
	if err != nil {
		return AutomationPinnedRepo{}, fmt.Errorf("upsert pinned automation repo: %w", err)
	}
	return pin, nil
}

func (s *Store) DeletePinnedRepo(ctx context.Context, workspaceID string, principalID string, owner string, repo string) error {
	if err := s.ensureDB(); err != nil {
		return err
	}
	result := s.db.WithContext(ctx).Where("workspace_id = ? AND principal_id = ? AND owner = ? AND repo = ?", strings.TrimSpace(workspaceID), strings.TrimSpace(principalID), strings.TrimSpace(owner), strings.TrimSpace(repo)).Delete(&AutomationPinnedRepo{})
	if result.Error != nil {
		return fmt.Errorf("delete pinned automation repo: %w", result.Error)
	}
	if result.RowsAffected == 0 {
		return gorm.ErrRecordNotFound
	}
	return nil
}
