package repository

import (
	"context"
	"testing"
	"time"

	"gitlab.com/mbugroup/lti-api.git/internal/common/exportprogress"

	"github.com/glebarez/sqlite"
	"gorm.io/gorm"
)

func TestRecordingRepositoryGetProgressRows(t *testing.T) {
	db := openRecordingProgressTestDB(t)
	repo := NewRecordingRepository(db)

	mustExecRecording(t, db, `CREATE TABLE locations (id INTEGER PRIMARY KEY, name TEXT)`)
	mustExecRecording(t, db, `CREATE TABLE project_flocks (id INTEGER PRIMARY KEY, flock_name TEXT, location_id INTEGER)`)
	mustExecRecording(t, db, `CREATE TABLE kandangs (id INTEGER PRIMARY KEY, name TEXT, location_id INTEGER)`)
	mustExecRecording(t, db, `CREATE TABLE project_flock_kandangs (id INTEGER PRIMARY KEY, project_flock_id INTEGER, kandang_id INTEGER)`)
	mustExecRecording(t, db, `CREATE TABLE recordings (id INTEGER PRIMARY KEY, project_flock_kandangs_id INTEGER, record_datetime DATETIME, deleted_at DATETIME)`)

	mustExecRecording(t, db, `INSERT INTO locations (id, name) VALUES (1, 'Location A')`)
	mustExecRecording(t, db, `INSERT INTO project_flocks (id, flock_name, location_id) VALUES (1, 'Farm A', 1)`)
	mustExecRecording(t, db, `INSERT INTO kandangs (id, name, location_id) VALUES (1, 'Kandang 1', 1)`)
	mustExecRecording(t, db, `INSERT INTO project_flock_kandangs (id, project_flock_id, kandang_id) VALUES (1, 1, 1)`)
	mustExecRecording(t, db, `INSERT INTO recordings (id, project_flock_kandangs_id, record_datetime, deleted_at) VALUES
		(1, 1, '2026-06-03 08:00:00', NULL),
		(2, 1, '2026-06-03 10:00:00', NULL),
		(3, 1, '2026-07-01 08:00:00', NULL)`)

	rows, err := repo.GetProgressRows(context.Background(), time.Date(2026, 6, 1, 0, 0, 0, 0, time.UTC), time.Date(2026, 6, 30, 0, 0, 0, 0, time.UTC), nil, false)
	if err != nil {
		t.Fatalf("GetProgressRows failed: %v", err)
	}

	if len(rows) != 1 {
		t.Fatalf("expected 1 grouped row, got %d", len(rows))
	}
	assertProgressRowRecording(t, rows, "Farm A", "Kandang 1", "2026-06-03", 2)
}

func openRecordingProgressTestDB(t *testing.T) *gorm.DB {
	t.Helper()
	db, err := gorm.Open(sqlite.Open("file:"+t.Name()+"?mode=memory&cache=private"), &gorm.Config{})
	if err != nil {
		t.Fatalf("failed opening sqlite db: %v", err)
	}
	return db
}

func mustExecRecording(t *testing.T, db *gorm.DB, query string, args ...any) {
	t.Helper()
	if err := db.Exec(query, args...).Error; err != nil {
		t.Fatalf("exec failed for %q: %v", query, err)
	}
}

func assertProgressRowRecording(t *testing.T, rows []exportprogress.Row, farm, kandang, date string, count int) {
	t.Helper()
	for _, row := range rows {
		if row.FarmName == farm && row.KandangName == kandang && row.ActivityDate.Format("2006-01-02") == date && row.Count == count {
			return
		}
	}
	t.Fatalf("expected row farm=%s kandang=%s date=%s count=%d, got %+v", farm, kandang, date, count, rows)
}
