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

namespace Hafenstudios\Leadlotse\Events;

defined( 'ABSPATH' ) || exit;

/**
 * CSV-Export der Teilnehmerliste "Fuer Excel exportieren" (L-R1).
 *
 * Bewusst CSV statt echtem XLSX (Entscheidung LR1, DECISIONS.md): UTF-8 mit
 * BOM und Semikolon-Trenner oeffnet in deutschem Excel per Doppelklick korrekt,
 * inklusive Umlauten - ohne jede Dependency. Zellen, die mit =, +, -, @
 * beginnen, werden mit einem Apostroph entschaerft (CSV-Injection-Schutz).
 */
final class ParticipantsExport {

	/**
	 * Baut die komplette CSV-Datei (inkl. BOM und Summenzeile).
	 *
	 * @param array{rows:array<int,array<string,mixed>>,total_persons:int,total_companions:int} $list Teilnehmerliste (ParticipantList::for_form).
	 * @return string CSV-Bytes.
	 */
	public static function build( array $list ): string {
		$labels = ParticipantList::status_labels();

		$lines   = array();
		$lines[] = self::line(
			array(
				__( 'Vorname', 'leadlotse' ),
				__( 'E-Mail', 'leadlotse' ),
				__( 'Telefon', 'leadlotse' ),
				__( 'Begleitpersonen', 'leadlotse' ),
				__( 'Personen gesamt', 'leadlotse' ),
				__( 'Status', 'leadlotse' ),
				__( 'Anmeldezeit', 'leadlotse' ),
			)
		);

		foreach ( (array) ( $list['rows'] ?? array() ) as $row ) {
			$lines[] = self::line(
				array(
					(string) ( $row['first_name'] ?? '' ),
					(string) ( $row['email'] ?? '' ),
					(string) ( $row['phone'] ?? '' ),
					(string) (int) ( $row['companions'] ?? 0 ),
					(string) (int) ( $row['persons'] ?? 0 ),
					(string) ( $labels[ (string) ( $row['status'] ?? '' ) ] ?? (string) ( $row['status'] ?? '' ) ),
					self::format_date( (string) ( $row['created_at'] ?? '' ) ),
				)
			);
		}

		$lines[] = self::line(
			array(
				__( 'Gesamt', 'leadlotse' ),
				'',
				'',
				(string) (int) ( $list['total_companions'] ?? 0 ),
				(string) (int) ( $list['total_persons'] ?? 0 ),
				'',
				'',
			)
		);

		// UTF-8-BOM, damit deutsches Excel die Kodierung erkennt (Umlaute!).
		return "\xEF\xBB\xBF" . implode( "\r\n", $lines ) . "\r\n";
	}

	/**
	 * Eine CSV-Zeile mit Semikolon-Trenner.
	 *
	 * @param array<int, string> $cells Zellen.
	 * @return string
	 */
	private static function line( array $cells ): string {
		return implode( ';', array_map( array( self::class, 'cell' ), $cells ) );
	}

	/**
	 * Escaped eine Zelle: Formel-Entschaerfung, Anfuehrungszeichen bei Bedarf.
	 *
	 * @param string $value Zellwert.
	 * @return string
	 */
	private static function cell( string $value ): string {
		// CSV-Injection: fuehrende Formelzeichen entschaerfen.
		if ( '' !== $value && in_array( $value[0], array( '=', '+', '-', '@' ), true ) ) {
			$value = "'" . $value;
		}
		if ( false !== strpbrk( $value, ";\"\r\n" ) ) {
			$value = '"' . str_replace( '"', '""', $value ) . '"';
		}
		return $value;
	}

	/**
	 * Anmeldezeit im Format d.m.Y H:i (Flotten-Linie K-M1: kein Sprach-Mix).
	 *
	 * @param string $mysql_date MySQL-Datum.
	 * @return string
	 */
	private static function format_date( string $mysql_date ): string {
		$timestamp = strtotime( $mysql_date );
		return false === $timestamp || '' === $mysql_date ? '' : gmdate( 'd.m.Y H:i', $timestamp );
	}
}
