package operations

import (
	"time"

	"rmser/internal/domain/operations"

	"gorm.io/gorm"
)

type pgRepository struct {
	db *gorm.DB
}

func NewRepository(db *gorm.DB) operations.Repository {
	return &pgRepository{db: db}
}

func (r *pgRepository) SaveOperations(ops []operations.StoreOperation, opType operations.OperationType, dateFrom, dateTo time.Time) error {
	return r.db.Transaction(func(tx *gorm.DB) error {
		// 1. Удаляем старые записи этого типа, которые пересекаются с периодом.
		// Так как отчет агрегированный, мы привязываемся к периоду "с" и "по".
		// Упрощение: удаляем всё, где PeriodFrom совпадает с текущей выгрузкой,
		// предполагая, что мы всегда грузим одними и теми же квантами (например, месяц или неделя).
		// Для надежности удалим всё, что попадает в диапазон.
		if err := tx.Where("op_type = ? AND period_from >= ? AND period_to <= ?", opType, dateFrom, dateTo).
			Delete(&operations.StoreOperation{}).Error; err != nil {
			return err
		}

		// 2. Вставляем новые
		if len(ops) > 0 {
			if err := tx.CreateInBatches(ops, 500).Error; err != nil {
				return err
			}
		}
		return nil
	})
}
