<?php
/**
 * Enregistrement dans la médiathèque.
 */

defined( 'ABSPATH' ) || exit;

/**
 * Dépose l'affiche dans le répertoire des images du site et crée la pièce jointe.
 */
class Mairie_Affiche_Information_Mediatheque {

	/**
	 * Dépose un binaire image dans la médiathèque.
	 *
	 * @param string $binaire  Contenu de l'image.
	 * @param string $nom      Nom de fichier souhaité.
	 * @param string $format   jpg ou png.
	 * @param string $titre    Titre de la pièce jointe.
	 * @param string $legende  Légende.
	 * @param string $cle_meta Clé de méta servant de repère interne.
	 * @param string $valeur   Valeur de cette méta.
	 * @return array|WP_Error  id, url, edit_url, nom.
	 */
	public static function deposer( $binaire, $nom, $format, $titre, $legende, $cle_meta, $valeur ) {
		// wp_upload_bits écrit dans le dossier d'upload courant (année/mois compris).
		$depot = wp_upload_bits( $nom, null, $binaire );
		if ( ! empty( $depot['error'] ) ) {
			return new WP_Error( 'mairie_affiche_information_upload', $depot['error'] );
		}

		$piece_jointe = array(
			'post_mime_type' => 'png' === $format ? 'image/png' : 'image/jpeg',
			'post_title'     => $titre,
			'post_content'   => '',
			'post_excerpt'   => $legende,
			'post_status'    => 'inherit',
		);

		$id = wp_insert_attachment( $piece_jointe, $depot['file'] );
		if ( is_wp_error( $id ) || ! $id ) {
			return new WP_Error( 'mairie_affiche_information_attachment', __( 'The attachment could not be created.', 'mairie-affiche-information' ) );
		}

		require_once ABSPATH . 'wp-admin/includes/image.php';
		wp_update_attachment_metadata( $id, wp_generate_attachment_metadata( $id, $depot['file'] ) );

		// Texte alternatif, utile pour l'accessibilité si l'image est publiée.
		update_post_meta( $id, '_wp_attachment_image_alt', $titre );

		// Repère interne : permet de retrouver les visuels générés.
		update_post_meta( $id, $cle_meta, $valeur );

		return array(
			'id'       => $id,
			'url'      => wp_get_attachment_url( $id ),
			'edit_url' => get_edit_post_link( $id, 'raw' ),
			'nom'      => $nom,
		);
	}

	/**
	 * Enregistre l'affiche de fermeture.
	 *
	 * @param string $texte     Texte de la date imprimé sur l'affiche.
	 * @param int    $timestamp Horodatage de la fermeture.
	 * @param string $format    jpg ou png.
	 * @return array|WP_Error
	 */
	public static function enregistrer( $texte, $timestamp, $format = 'jpg' ) {
		$binaire = Mairie_Affiche_Information_Generateur::rendu( $texte, $format );
		if ( is_wp_error( $binaire ) ) {
			return $binaire;
		}

		$titre = sprintf(
			/* translators: %s: closure date spelled out. */
			__( 'Town hall office closed — %s', 'mairie-affiche-information' ),
			$texte
		);

		$legende = sprintf(
			/* translators: %s: closure date spelled out. */
			__( 'The town hall office will be closed on %s.', 'mairie-affiche-information' ),
			$texte
		);

		$resultat = self::deposer(
			$binaire,
			Mairie_Affiche_Information_Generateur::nom_fichier( $timestamp, $format ),
			$format,
			$titre,
			$legende,
			'_mairie_affiche_information_date',
			wp_date( 'Y-m-d', $timestamp )
		);

		if ( ! is_wp_error( $resultat ) ) {
			/**
			 * Déclenché après l'enregistrement d'une affiche de fermeture.
			 *
			 * @param int    $id        Identifiant de la pièce jointe.
			 * @param int    $timestamp Date de fermeture.
			 * @param string $texte     Libellé imprimé.
			 */
			do_action( 'mairie_affiche_information_affiche_enregistree', $resultat['id'], $timestamp, $texte );
		}

		return $resultat;
	}

	/**
	 * Enregistre l'affiche du conseil municipal.
	 *
	 * @param int    $timestamp Date du conseil.
	 * @param string $heure     Heure HH:MM.
	 * @param string $lieu      Lieu.
	 * @param string $format    jpg ou png.
	 * @return array|WP_Error
	 */
	public static function enregistrer_conseil( $timestamp, $heure, $lieu, $format = 'jpg' ) {
		$binaire = Mairie_Affiche_Information_Conseil::rendu( $timestamp, $heure, $lieu, $format );
		if ( is_wp_error( $binaire ) ) {
			return $binaire;
		}

		$quand = wp_date( 'j F Y', $timestamp ) . ' — ' . Mairie_Affiche_Information_Conseil::libelle_heure( $heure );

		$titre = sprintf(
			/* translators: %s: council meeting date and time. */
			__( 'Council meeting — %s', 'mairie-affiche-information' ),
			$quand
		);

		$legende = sprintf(
			/* translators: 1: date and time, 2: venue. */
			__( 'The next council meeting takes place on %1$s, %2$s.', 'mairie-affiche-information' ),
			$quand,
			$lieu
		);

		$resultat = self::deposer(
			$binaire,
			Mairie_Affiche_Information_Conseil::nom_fichier( $timestamp, $format ),
			$format,
			$titre,
			$legende,
			'_mairie_affiche_information_conseil_date',
			wp_date( 'Y-m-d', $timestamp )
		);

		if ( ! is_wp_error( $resultat ) ) {
			/**
			 * Déclenché après l'enregistrement d'une affiche de conseil municipal.
			 *
			 * @param int    $id        Identifiant de la pièce jointe.
			 * @param int    $timestamp Date du conseil.
			 * @param string $heure     Heure imprimée.
			 * @param string $lieu      Lieu imprimé.
			 */
			do_action( 'mairie_affiche_information_conseil_enregistre', $resultat['id'], $timestamp, $heure, $lieu );
		}

		return $resultat;
	}

	/**
	 * Dernières affiches générées.
	 *
	 * @param int $nombre Nombre d'éléments.
	 * @return WP_Post[]
	 */
	public static function recentes( $nombre = 6, $cle_meta = '_mairie_affiche_information_date' ) {
		return get_posts(
			array(
				'post_type'      => 'attachment',
				'post_status'    => 'inherit',
				'posts_per_page' => $nombre,
				'meta_key'       => $cle_meta, // phpcs:ignore WordPress.DB.SlowDBQuery
				'orderby'        => 'date',
				'order'          => 'DESC',
				'no_found_rows'  => true,
				'update_post_term_cache' => false,
			)
		);
	}
}
