package db_utils

import (
	"testing"
)

func TestPageParams_Validate(t *testing.T) {
	tests := []struct {
		name    string
		params  PageParams
		wantErr bool
	}{
		{"ValidParams", PageParams{Limit: 10, Offset: 5}, false},
		{"NegativeLimit", PageParams{Limit: -1, Offset: 5}, true},
		{"NegativeOffset", PageParams{Limit: 10, Offset: -1}, true},
	}

	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			err := tt.params.Validate()
			if (err != nil) != tt.wantErr {
				t.Errorf("Validate() error = %v, wantErr %v", err, tt.wantErr)
			}
		})
	}
}

func TestPageParams_EnforceLimit(t *testing.T) {
	tests := []struct {
		name   string
		params PageParams
		want   int64
	}{
		{"NoLimit", PageParams{Limit: 0}, 20},
		{"NegativeLimit", PageParams{Limit: -5}, 20},
		{"PositiveLimit", PageParams{Limit: 10}, 10},
	}

	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			tt.params.EnforceLimit()
			if tt.params.Limit != tt.want {
				t.Errorf("EnforceLimit() = %v, want %v", tt.params.Limit, tt.want)
			}
		})
	}
}

func TestValidateDateFilters(t *testing.T) {
	type args struct {
		params                any
		dateFiltersToValidate []string
	}
	tests := []struct {
		name    string
		args    args
		wantErr bool
	}{
		{
			"ValidDateFilter",
			args{params: struct {
				Date string `json:"date"`
			}{Date: "2023-10-01T00:00:00Z"}, dateFiltersToValidate: []string{"date"}},
			false,
		},
		{
			"InvalidDateFilter",
			args{params: struct {
				Date string `json:"date"`
			}{Date: "invalid-date"}, dateFiltersToValidate: []string{"date"}},
			true,
		},
		{
			"MissingDateFilter",
			args{params: struct {
				Date string `json:"date"`
			}{Date: "2023-10-01T00:00:00Z"}, dateFiltersToValidate: []string{"non_existent_date"}},
			false,
		},
	}

	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			if err := ValidateDateFilters(tt.args.params, tt.args.dateFiltersToValidate...); (err != nil) != tt.wantErr {
				t.Errorf("ValidateDateFilters() error = %v, wantErr %v", err, tt.wantErr)
			}
		})
	}
}