<?php
/**
 * Libro Soci CSV export.
 *
 * @package TonItaliaRegistration
 */

defined( 'ABSPATH' ) || exit;

/**
 * Class TON_Reg_Members_Export
 */
class TON_Reg_Members_Export {

	const CSV_DELIMITER = ';';

	/**
	 * @return array<int,string>
	 */
	public static function get_columns() {
		return array(
			__( 'N.', 'ton-italia-registration' ),
			__( 'Cognome', 'ton-italia-registration' ),
			__( 'Nome', 'ton-italia-registration' ),
			__( 'Data di nascita', 'ton-italia-registration' ),
			__( 'Luogo di nascita', 'ton-italia-registration' ),
			__( 'Provincia nascita', 'ton-italia-registration' ),
			__( 'Codice fiscale', 'ton-italia-registration' ),
			__( 'Indirizzo', 'ton-italia-registration' ),
			__( 'CAP', 'ton-italia-registration' ),
			__( 'Comune residenza', 'ton-italia-registration' ),
			__( 'Provincia residenza', 'ton-italia-registration' ),
			__( 'Telefono', 'ton-italia-registration' ),
			__( 'Email', 'ton-italia-registration' ),
			__( 'Data iscrizione', 'ton-italia-registration' ),
			__( 'Data Libro Associati', 'ton-italia-registration' ),
		);
	}

	/**
	 * @param object $row   Registration row.
	 * @param int    $index 1-based row number.
	 * @return array<int,string>
	 */
	public static function row_to_csv( $row, $index ) {
		$address = trim( ( $row->indirizzo ?? '' ) . ' ' . ( $row->numero_civico ?? '' ) );

		return array(
			(string) $index,
			(string) ( $row->cognome ?? '' ),
			(string) ( $row->nome ?? '' ),
			self::format_date_it( $row->data_nascita ?? '' ),
			(string) ( $row->luogo_nascita ?? '' ),
			(string) ( $row->provincia_nascita ?? '' ),
			strtoupper( (string) ( $row->codice_fiscale ?? '' ) ),
			$address,
			(string) ( $row->cap ?? '' ),
			(string) ( $row->comune_residenza ?? '' ),
			(string) ( $row->provincia_residenza ?? '' ),
			(string) ( $row->telefono ?? '' ),
			(string) ( $row->email ?? '' ),
			self::format_date_it( $row->created_at ?? '' ),
			self::format_date_it( $row->libro_associati_date ?? '' ),
		);
	}

	/**
	 * Stream Libro Soci CSV to output.
	 */
	public static function stream_libro_soci_csv() {
		$rows = TON_Reg_Database::query_for_export(
			array(
				'status'             => 'admitted',
				'exclude_anonymized' => true,
				'orderby'            => 'cognome',
				'order'              => 'ASC',
			)
		);

		$filename = 'libro-soci-ton-italia-' . gmdate( 'Y-m-d' ) . '.csv';

		nocache_headers();
		header( 'Content-Type: text/csv; charset=utf-8' );
		header( 'Content-Disposition: attachment; filename="' . sanitize_file_name( $filename ) . '"' );

		$out = fopen( 'php://output', 'w' );
		if ( false === $out ) {
			wp_die( esc_html__( 'Impossibile generare il file CSV.', 'ton-italia-registration' ) );
		}

		// UTF-8 BOM for Excel (IT).
		fprintf( $out, chr( 0xEF ) . chr( 0xBB ) . chr( 0xBF ) );

		fputcsv( $out, self::get_columns(), self::CSV_DELIMITER );

		$index = 1;
		foreach ( $rows as $row ) {
			fputcsv( $out, self::row_to_csv( $row, $index ), self::CSV_DELIMITER );
			++$index;
		}

		fclose( $out );
		exit;
	}

	/**
	 * @param string|null $value Date or datetime.
	 * @return string
	 */
	private static function format_date_it( $value ) {
		if ( empty( $value ) ) {
			return '';
		}

		$timestamp = strtotime( (string) $value );
		if ( false === $timestamp ) {
			return '';
		}

		return wp_date( 'd/m/Y', $timestamp );
	}
}
