<?php
/**
 * @package Hafenstudios\Wellenbrecher
 */

namespace Hafenstudios\Wellenbrecher\Db;

defined( 'ABSPATH' ) || exit;

/**
 * Abfragen gegen die native WP-Kommentartabelle: Trust-Signal (E-Mail hat
 * bereits einen genehmigten Kommentar, ASB already_commented) und das
 * localdb-Muster (Autor-E-Mail/-URL/IP im Klartext gegen den Spam-Ordner,
 * WB10). Der Klartext liegt im WP-Spam-Ordner ohnehin; unser eigenes Log
 * bleibt davon unberuehrt (dort nie Klartext).
 */
class CommentLookup {

	/**
	 * Hat die E-Mail-Adresse bereits einen genehmigten Kommentar?
	 *
	 * @param string $email Autor-E-Mail.
	 * @return bool
	 */
	public function has_approved_comment( string $email ): bool {
		global $wpdb;

		$email = trim( $email );
		if ( '' === $email ) {
			return false;
		}
		// phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- Kern-Tabellenname, Wert prepared.
		$count = (int) $wpdb->get_var(
			$wpdb->prepare( "SELECT COUNT(*) FROM {$wpdb->comments} WHERE comment_approved = '1' AND comment_author_email = %s", $email )
		);
		return $count > 0;
	}

	/**
	 * Verifizierter WooCommerce-Kaeufer? (Trust-Abzug fuer Produkt-Reviews,
	 * Bauplan Kap. 6/7.4). Nur mit aktivem WooCommerce (Guard) - Wellenbrecher
	 * bundelt Woo NICHT. Zum Bewertungszeitpunkt ist der Kommentar noch nicht
	 * gespeichert, die 'verified'-Comment-Meta existiert also noch nicht;
	 * geprueft wird deshalb direkt ueber wc_customer_bought_product - dieselbe
	 * Quelle, aus der WooCommerce spaeter die 'verified'-Meta setzt.
	 *
	 * @param string $email      Autor-E-Mail.
	 * @param int    $user_id    Nutzer-ID (0 fuer Gaeste).
	 * @param int    $product_id Produkt-ID (comment_post_ID der Review).
	 * @return bool
	 */
	public function is_verified_buyer( string $email, int $user_id, int $product_id ): bool {
		if ( $product_id <= 0 || ! function_exists( 'wc_customer_bought_product' ) ) {
			return false;
		}
		$email = trim( $email );
		if ( '' === $email && $user_id <= 0 ) {
			return false;
		}
		return (bool) wc_customer_bought_product( $email, $user_id, $product_id );
	}

	/**
	 * localdb-Abgleich: matcht E-Mail, URL oder IP einen vorhandenen
	 * Kommentar mit comment_approved = 'spam'? Leere Werte werden nicht
	 * abgeglichen (sonst traefe jede leere URL jeden Spam ohne URL).
	 *
	 * @param string $email Autor-E-Mail.
	 * @param string $url   Autor-URL.
	 * @param string $ip    Client-IP (Klartext, nur fuer den Kern-Abgleich).
	 * @return bool
	 */
	public function has_spam_match( string $email, string $url, string $ip ): bool {
		global $wpdb;

		$checks = array(
			'comment_author_email' => trim( $email ),
			'comment_author_url'   => trim( $url ),
			'comment_author_IP'    => trim( $ip ),
		);

		foreach ( $checks as $column => $value ) {
			if ( '' === $value ) {
				continue;
			}
			// phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- Kern-Tabellenname, Spalte aus eigener Whitelist, Wert prepared.
			$count = (int) $wpdb->get_var(
				$wpdb->prepare( "SELECT COUNT(*) FROM {$wpdb->comments} WHERE comment_approved = 'spam' AND {$column} = %s", $value )
			);
			if ( $count > 0 ) {
				return true;
			}
		}
		return false;
	}
}
