package services

import (
	"regexp"
	"strings"
)

var accessDurationQuestion = regexp.MustCompile(`(?i)(?:masa|lama|durasi)\s+akses|akses\w*[^.!?\n]{0,30}(?:(?:sampai|hingga|sampe|smpe|smp)\s+(?:kapan|kpn)|berapa\s+lama)|berapa\s+lama[^.!?\n]{0,30}akses`)
var accessDurationAnswer = regexp.MustCompile(`(?i)selamanya|seumur\s+hidup|lifetime|tanpa\s+batas\s+waktu|tidak\s+(?:ada\s+)?batas\s+waktu|(?:\d+|satu|dua|tiga|empat|lima|enam|tujuh|delapan|sembilan|sepuluh)\s*(?:hari|minggu|bulan|tahun|jam)\b|(?:sampai|hingga|berakhir)[^.!?\n]{0,35}\d|(?:masa|durasi|lama)\s+akses[^.!?\n]{0,60}(?:belum|tidak)\s+(?:diketahui|tercantum|dijelaskan|tersedia|dapat\s+dipastikan)`)

// Common omission observed in live evaluation: a payment frequency is not an
// access duration. This supplements semantic review, without inventing a term.
func missingExplicitAnswerAspect(question, answer string) string {
	if accessDurationQuestion.MatchString(question) && !accessDurationAnswer.MatchString(answer) {
		return "lama akses yang eksplisit; sekali bayar atau tidak ada perpanjangan belum menjawab sampai kapan akses berlaku"
	}
	return ""
}

var negativeAvailabilityClaim = regexp.MustCompile(`(?i)\b(?:tidak|belum)\s+(?:ada|tersedia|menjual|menyediakan|mendukung)\b[^.!?\n]*`)
var availabilityEntity = regexp.MustCompile(`(?i)\b(?:produk|kursus|kelas|paket|layanan|stok|fitur|garansi|aplikasi|barang)\b`)

// A list of unrelated products is not evidence that a requested product does
// not exist. Check topic coverage before the semantic verdict can infer absence.
func unsupportedAvailabilityClaim(answer, evidence string) string {
	for _, claim := range negativeAvailabilityClaim.FindAllString(answer, -1) {
		lower := strings.ToLower(claim)
		if strings.Contains(lower, "informasi") || strings.Contains(lower, "keterangan") {
			continue
		}
		if availabilityEntity.MatchString(claim) && tokenOverlapRatio(claim, contentTokenSet(evidence)) < .7 {
			return claim
		}
	}
	return ""
}
