package services

import (
	"context"
	"fmt"
	"regexp"
	"strings"

	"report_go/internal/models"
	"report_go/internal/repositories"
)

type CaseReportService struct {
	Repo *repositories.CaseReportRepository
}

func NewCaseReportService(repo *repositories.CaseReportRepository) *CaseReportService {
	return &CaseReportService{Repo: repo}
}

func (s *CaseReportService) GetCaseList(ctx context.Context, f models.CaseReportFilter) (*models.CaseListResult, error) {
	if err := normalizeAndValidateFilter(&f); err != nil {
		return nil, err
	}
	return s.Repo.FindCases(ctx, f)
}

func (s *CaseReportService) GetSummary(ctx context.Context, f models.CaseReportFilter) (*models.CaseSummary, error) {
	if err := normalizeAndValidateFilter(&f); err != nil {
		return nil, err
	}

	f.Page = 1
	f.Limit = 1
	f.Offset = 0

	return s.Repo.GetSummary(ctx, f)
}

func normalizeAndValidateFilter(f *models.CaseReportFilter) error {
	if f.PartnerCompanyID <= 0 {
		return fmt.Errorf("partner_company_id is required")
	}

	f.Keyword = strings.TrimSpace(f.Keyword)
	f.Status = strings.TrimSpace(f.Status)
	f.CaseServiceCode = strings.TrimSpace(f.CaseServiceCode)
	f.DateFrom = strings.TrimSpace(f.DateFrom)
	f.DateTo = strings.TrimSpace(f.DateTo)

	if f.Page <= 0 {
		f.Page = 1
	}
	if f.Limit <= 0 {
		f.Limit = 20
	}
	if f.Limit > 200 {
		f.Limit = 200
	}

	if f.DateFrom != "" && !isYMD(f.DateFrom) {
		return fmt.Errorf("date_from must be YYYY-MM-DD")
	}
	if f.DateTo != "" && !isYMD(f.DateTo) {
		return fmt.Errorf("date_to must be YYYY-MM-DD")
	}

	f.Offset = (f.Page - 1) * f.Limit
	return nil
}

var ymdRe = regexp.MustCompile(`^\d{4}-\d{2}-\d{2}$`)

func isYMD(s string) bool {
	return ymdRe.MatchString(s)
}