package automation

import (
	"context"
	"fmt"
	"strings"
)

func (s *Store) CreateJobRuns(ctx context.Context, jobRuns []AutomationJobRun) error {
	if err := s.ensureDB(); err != nil {
		return err
	}
	if len(jobRuns) == 0 {
		return nil
	}
	if err := s.db.WithContext(ctx).Create(&jobRuns).Error; err != nil {
		return fmt.Errorf("create automation job runs: %w", err)
	}
	return nil
}

func (s *Store) ListJobRuns(ctx context.Context, workspaceID string, runID string) ([]AutomationJobRun, error) {
	if err := s.ensureDB(); err != nil {
		return nil, err
	}
	var jobRuns []AutomationJobRun
	if err := s.db.WithContext(ctx).Where("workspace_id = ? AND run_id = ?", strings.TrimSpace(workspaceID), strings.TrimSpace(runID)).Order("created_at ASC").Order("id ASC").Find(&jobRuns).Error; err != nil {
		return nil, fmt.Errorf("list automation job runs: %w", err)
	}
	return jobRuns, nil
}

func (s *Store) GetJobRun(ctx context.Context, workspaceID string, jobRunID string) (AutomationJobRun, error) {
	if err := s.ensureDB(); err != nil {
		return AutomationJobRun{}, err
	}
	var jobRun AutomationJobRun
	err := s.db.WithContext(ctx).Where("workspace_id = ? AND id = ?", strings.TrimSpace(workspaceID), strings.TrimSpace(jobRunID)).First(&jobRun).Error
	if err != nil {
		return AutomationJobRun{}, err
	}
	return jobRun, nil
}

func (s *Store) UpdateJobRun(ctx context.Context, jobRun AutomationJobRun) (AutomationJobRun, error) {
	if err := s.ensureDB(); err != nil {
		return AutomationJobRun{}, err
	}
	if err := s.db.WithContext(ctx).Save(&jobRun).Error; err != nil {
		return AutomationJobRun{}, fmt.Errorf("update automation job run: %w", err)
	}
	return jobRun, nil
}

func (s *Store) CreateEvent(ctx context.Context, event AutomationEvent) (AutomationEvent, error) {
	if err := s.ensureDB(); err != nil {
		return AutomationEvent{}, err
	}
	if err := s.db.WithContext(ctx).Create(&event).Error; err != nil {
		return AutomationEvent{}, fmt.Errorf("create automation event: %w", err)
	}
	return event, nil
}

func (s *Store) ListEvents(ctx context.Context, workspaceID string, runID string, page int, perPage int) ([]AutomationEvent, error) {
	if err := s.ensureDB(); err != nil {
		return nil, err
	}
	offset := (page - 1) * perPage
	var events []AutomationEvent
	if err := s.db.WithContext(ctx).Where("workspace_id = ? AND run_id = ?", strings.TrimSpace(workspaceID), strings.TrimSpace(runID)).Order("created_at ASC").Order("id ASC").Limit(perPage).Offset(offset).Find(&events).Error; err != nil {
		return nil, fmt.Errorf("list automation events: %w", err)
	}
	return events, nil
}
