<?php
/**
 * Écrans d'administration.
 */

defined( 'ABSPATH' ) || exit;

/**
 * Menu, page de génération, page de réglages.
 */
class Mairie_Affiche_Information_Admin {

	const SLUG          = 'mairie-affiche-information';
	const SLUG_CONSEIL  = 'mairie-affiche-information-conseil';
	const SLUG_REGLAGES = 'mairie-affiche-information-reglages';

	/**
	 * Accroches.
	 */
	public static function init() {
		add_action( 'admin_menu', array( __CLASS__, 'menu' ) );
		add_action( 'admin_init', array( __CLASS__, 'enregistrer_reglages' ) );
		add_action( 'add_option_' . MAIRIE_AFFICHE_INFORMATION_OPTION, array( __CLASS__, 'apres_ajout' ), 10, 2 );
		add_action( 'update_option_' . MAIRIE_AFFICHE_INFORMATION_OPTION, array( __CLASS__, 'apres_mise_a_jour' ), 10, 2 );
		add_action( 'admin_enqueue_scripts', array( __CLASS__, 'assets' ) );
		add_filter( 'plugin_action_links_' . plugin_basename( MAIRIE_AFFICHE_INFORMATION_FILE ), array( __CLASS__, 'lien_reglages' ) );
	}

	/**
	 * Entrées de menu.
	 */
	public static function menu() {
		if ( mairie_affiche_information_utilisateur_autorise() ) {
			add_menu_page(
				__( 'Town hall notices', 'mairie-affiche-information' ),
				__( 'Town hall notices', 'mairie-affiche-information' ),
				MAIRIE_AFFICHE_INFORMATION_CAP,
				self::SLUG,
				array( __CLASS__, 'page_generateur' ),
				'dashicons-bank',
				58
			);

			add_submenu_page(
				self::SLUG,
				__( 'Closure notice', 'mairie-affiche-information' ),
				__( 'Closure notice', 'mairie-affiche-information' ),
				MAIRIE_AFFICHE_INFORMATION_CAP,
				self::SLUG,
				array( __CLASS__, 'page_generateur' )
			);
		}

		if ( mairie_affiche_information_utilisateur_autorise() ) {
			add_submenu_page(
				self::SLUG,
				__( 'Council meeting', 'mairie-affiche-information' ),
				__( 'Council meeting', 'mairie-affiche-information' ),
				MAIRIE_AFFICHE_INFORMATION_CAP,
				self::SLUG_CONSEIL,
				array( __CLASS__, 'page_conseil' )
			);
		}

		add_submenu_page(
			current_user_can( MAIRIE_AFFICHE_INFORMATION_CAP ) ? self::SLUG : 'options-general.php',
			__( 'Settings — Town hall notices', 'mairie-affiche-information' ),
			__( 'Settings', 'mairie-affiche-information' ),
			'manage_options',
			self::SLUG_REGLAGES,
			array( __CLASS__, 'page_reglages' )
		);
	}

	/**
	 * Lien « Réglages » depuis la liste des extensions.
	 *
	 * @param array $liens Liens existants.
	 * @return array
	 */
	public static function lien_reglages( $liens ) {
		$url = admin_url( 'admin.php?page=' . self::SLUG_REGLAGES );
		array_unshift( $liens, '<a href="' . esc_url( $url ) . '">' . esc_html__( 'Settings', 'mairie-affiche-information' ) . '</a>' );
		return $liens;
	}

	/**
	 * Déclaration de l'option.
	 */
	public static function enregistrer_reglages() {
		register_setting(
			'mairie_affiche_information_groupe',
			MAIRIE_AFFICHE_INFORMATION_OPTION,
			array(
				'type'              => 'array',
				'sanitize_callback' => array( 'Mairie_Affiche_Information_Reglages', 'valider' ),
				'default'           => Mairie_Affiche_Information_Reglages::defauts(),
			)
		);
	}

	/**
	 * Première écriture de l'option.
	 *
	 * @param string $option  Nom de l'option.
	 * @param array  $valeur  Valeur enregistrée.
	 */
	public static function apres_ajout( $option, $valeur ) {
		if ( is_array( $valeur ) && isset( $valeur['roles'] ) ) {
			Mairie_Affiche_Information_Capacites::synchroniser( $valeur['roles'] );
		}
	}

	/**
	 * Mise à jour de l'option : la capacité suit les rôles cochés.
	 *
	 * @param array $ancien Ancienne valeur.
	 * @param array $valeur Nouvelle valeur.
	 */
	public static function apres_mise_a_jour( $ancien, $valeur ) {
		if ( is_array( $valeur ) && isset( $valeur['roles'] ) ) {
			Mairie_Affiche_Information_Capacites::synchroniser( $valeur['roles'] );
		}
	}

	/**
	 * Scripts et styles des écrans du plugin.
	 *
	 * @param string $hook Page courante.
	 */
	public static function assets( $hook ) {
		if ( false === strpos( $hook, self::SLUG ) ) {
			return;
		}

		wp_enqueue_style( 'mairie-affiche-information', MAIRIE_AFFICHE_INFORMATION_URL . 'assets/admin.css', array(), MAIRIE_AFFICHE_INFORMATION_VERSION );

		if ( false !== strpos( $hook, self::SLUG_REGLAGES ) ) {
			wp_enqueue_media();
			wp_enqueue_script( 'mairie-affiche-information-reglages', MAIRIE_AFFICHE_INFORMATION_URL . 'assets/reglages.js', array( 'jquery' ), MAIRIE_AFFICHE_INFORMATION_VERSION, true );
			wp_localize_script(
				'mairie-affiche-information-reglages',
				'mairieAfficheInfoReglages',
				array(
					'fondDefaut'        => MAIRIE_AFFICHE_INFORMATION_URL . 'assets/fond_mairie.jpg',
					'fondConseilDefaut' => MAIRIE_AFFICHE_INFORMATION_URL . 'assets/fond_conseil.jpg',
					'titreMedia'  => __( 'Choose the background image', 'mairie-affiche-information' ),
					'boutonMedia' => __( 'Use this image', 'mairie-affiche-information' ),
				)
			);
			return;
		}

		$conseil = ( false !== strpos( $hook, self::SLUG_CONSEIL ) );

		wp_enqueue_script(
			'mairie-affiche-information',
			MAIRIE_AFFICHE_INFORMATION_URL . ( $conseil ? 'assets/conseil.js' : 'assets/admin.js' ),
			array( 'jquery' ),
			MAIRIE_AFFICHE_INFORMATION_VERSION,
			true
		);
		wp_localize_script(
			'mairie-affiche-information',
			'mairieAfficheInfoData',
			array(
				'ajaxUrl'      => admin_url( 'admin-ajax.php' ),
				'nonceApercu'  => wp_create_nonce( $conseil ? 'mairie_affiche_information_conseil_apercu' : 'mairie_affiche_information_apercu' ),
				'nonceEnreg'   => wp_create_nonce( $conseil ? 'mairie_affiche_information_conseil_enregistrer' : 'mairie_affiche_information_enregistrer' ),
				'msgEnCours'   => __( 'Saving…', 'mairie-affiche-information' ),
				'msgEnregistr' => __( 'Save to Media Library', 'mairie-affiche-information' ),
				'msgErreur'    => __( 'Something went wrong.', 'mairie-affiche-information' ),
				'msgOuvrir'    => __( 'Open the attachment', 'mairie-affiche-information' ),
				'msgVoir'      => __( 'View the file', 'mairie-affiche-information' ),
			)
		);
	}

	/**
	 * Écran principal : génération.
	 */
	public static function page_generateur() {
		if ( ! mairie_affiche_information_utilisateur_autorise() ) {
			wp_die( esc_html__( "You are not allowed to generate notices.", 'mairie-affiche-information' ) );
		}

		$reglages  = Mairie_Affiche_Information_Reglages::get();
		$timestamp = time();
		$iso       = wp_date( 'Y-m-d', $timestamp );
		$recentes  = Mairie_Affiche_Information_Mediatheque::recentes( 6 );
		?>
		<div class="wrap mai-wrap">
			<h1><?php esc_html_e( 'Town hall closure notice', 'mairie-affiche-information' ); ?></h1>

			<?php if ( ! Mairie_Affiche_Information_Generateur::gd_disponible() ) : ?>
				<div class="notice notice-error"><p>
					<?php esc_html_e( "The GD extension built with FreeType is required: image generation is not possible on this server.", 'mairie-affiche-information' ); ?>
				</p></div>
			<?php endif; ?>

			<p class="description">
				<?php esc_html_e( 'Pick a date: the preview updates on its own. Saving drops the file into the site Media Library.', 'mairie-affiche-information' ); ?>
			</p>

			<div class="mai-grille">
				<div class="mai-colonne">
					<table class="form-table" role="presentation">
						<tr>
							<th scope="row"><label for="mai-date"><?php esc_html_e( 'Closure date', 'mairie-affiche-information' ); ?></label></th>
							<td><input type="date" id="mai-date" value="<?php echo esc_attr( $iso ); ?>" class="regular-text"></td>
						</tr>
						<tr>
							<th scope="row"><label for="mai-texte"><?php esc_html_e( 'Custom text', 'mairie-affiche-information' ); ?></label></th>
							<td>
								<input type="text" id="mai-texte" class="regular-text" placeholder="<?php esc_attr_e( 'e.g. From 10 to 21 August 2026', 'mairie-affiche-information' ); ?>">
								<p class="description"><?php esc_html_e( 'Optional: replaces the automatically generated date.', 'mairie-affiche-information' ); ?></p>
							</td>
						</tr>
						<tr>
							<th scope="row"><label for="mai-format"><?php esc_html_e( 'Format', 'mairie-affiche-information' ); ?></label></th>
							<td>
								<select id="mai-format">
									<option value="jpg" <?php selected( $reglages['format'], 'jpg' ); ?>>JPEG</option>
									<option value="png" <?php selected( $reglages['format'], 'png' ); ?>>PNG</option>
								</select>
							</td>
						</tr>
					</table>

					<p class="mai-actions">
						<button type="button" class="button button-primary" id="mai-enregistrer"><?php esc_html_e( 'Save to Media Library', 'mairie-affiche-information' ); ?></button>
						<a href="#" class="button" id="mai-telecharger" download><?php esc_html_e( 'Download', 'mairie-affiche-information' ); ?></a>
						<span class="spinner" id="mai-spinner"></span>
					</p>

					<div id="mai-message" class="notice inline" style="display:none"><p></p></div>
				</div>

				<div class="mai-colonne">
					<img id="mai-apercu" alt="<?php esc_attr_e( 'Notice preview', 'mairie-affiche-information' ); ?>">
				</div>
			</div>

			<?php if ( $recentes ) : ?>
				<h2><?php esc_html_e( 'Recent notices', 'mairie-affiche-information' ); ?></h2>
				<ul class="mai-recentes">
					<?php foreach ( $recentes as $piece ) : ?>
						<li>
							<a href="<?php echo esc_url( get_edit_post_link( $piece->ID ) ); ?>">
								<?php echo wp_kses_post( wp_get_attachment_image( $piece->ID, 'thumbnail' ) ); ?>
								<span><?php echo esc_html( get_post_meta( $piece->ID, '_mairie_affiche_information_date', true ) ); ?></span>
							</a>
						</li>
					<?php endforeach; ?>
				</ul>
			<?php endif; ?>
		</div>
		<?php
	}

	/**
	 * Écran « Conseil municipal ».
	 */
	public static function page_conseil() {
		if ( ! mairie_affiche_information_utilisateur_autorise() ) {
			wp_die( esc_html__( 'You are not allowed to generate notices.', 'mairie-affiche-information' ) );
		}

		$reglages  = Mairie_Affiche_Information_Reglages::get();
		$timestamp = time();
		$iso       = wp_date( 'Y-m-d', $timestamp );
		$recentes  = Mairie_Affiche_Information_Mediatheque::recentes( 6, '_mairie_affiche_information_conseil_date' );
		?>
		<div class="wrap mai-wrap">
			<h1><?php esc_html_e( 'Council meeting notice', 'mairie-affiche-information' ); ?></h1>

			<?php if ( ! Mairie_Affiche_Information_Generateur::gd_disponible() ) : ?>
				<div class="notice notice-error"><p>
					<?php esc_html_e( 'The GD extension built with FreeType is required: image generation is not possible on this server.', 'mairie-affiche-information' ); ?>
				</p></div>
			<?php endif; ?>

			<p class="description">
				<?php esc_html_e( 'Fill in the date, the time and the venue: the preview updates on its own.', 'mairie-affiche-information' ); ?>
			</p>

			<div class="mai-grille">
				<div class="mai-colonne">
					<table class="form-table" role="presentation">
						<tr>
							<th scope="row"><label for="mai-date"><?php esc_html_e( 'Meeting date', 'mairie-affiche-information' ); ?></label></th>
							<td><input type="date" id="mai-date" value="<?php echo esc_attr( $iso ); ?>" class="regular-text"></td>
						</tr>
						<tr>
							<th scope="row"><label for="mai-heure"><?php esc_html_e( 'Time', 'mairie-affiche-information' ); ?></label></th>
							<td><input type="time" id="mai-heure" value="<?php echo esc_attr( $reglages['conseil_heure'] ); ?>"></td>
						</tr>
						<tr>
							<th scope="row"><label for="mai-lieu"><?php esc_html_e( 'Venue', 'mairie-affiche-information' ); ?></label></th>
							<td>
								<input type="text" id="mai-lieu" class="regular-text" value="<?php echo esc_attr( $reglages['conseil_lieu'] ); ?>">
								<p class="description"><?php esc_html_e( 'Printed in capitals. The default value is set in the settings screen.', 'mairie-affiche-information' ); ?></p>
							</td>
						</tr>
						<tr>
							<th scope="row"><label for="mai-format"><?php esc_html_e( 'Format', 'mairie-affiche-information' ); ?></label></th>
							<td>
								<select id="mai-format">
									<option value="jpg" <?php selected( $reglages['format'], 'jpg' ); ?>>JPEG</option>
									<option value="png" <?php selected( $reglages['format'], 'png' ); ?>>PNG</option>
								</select>
							</td>
						</tr>
					</table>

					<p class="mai-actions">
						<button type="button" class="button button-primary" id="mai-enregistrer"><?php esc_html_e( 'Save to Media Library', 'mairie-affiche-information' ); ?></button>
						<a href="#" class="button" id="mai-telecharger" download><?php esc_html_e( 'Download', 'mairie-affiche-information' ); ?></a>
						<span class="spinner" id="mai-spinner"></span>
					</p>

					<div id="mai-message" class="notice inline" style="display:none"><p></p></div>
				</div>

				<div class="mai-colonne">
					<img id="mai-apercu" alt="<?php esc_attr_e( 'Notice preview', 'mairie-affiche-information' ); ?>">
				</div>
			</div>

			<?php if ( $recentes ) : ?>
				<h2><?php esc_html_e( 'Recent notices', 'mairie-affiche-information' ); ?></h2>
				<ul class="mai-recentes">
					<?php foreach ( $recentes as $piece ) : ?>
						<li>
							<a href="<?php echo esc_url( get_edit_post_link( $piece->ID ) ); ?>">
								<?php echo wp_kses_post( wp_get_attachment_image( $piece->ID, 'thumbnail' ) ); ?>
								<span><?php echo esc_html( get_post_meta( $piece->ID, '_mairie_affiche_information_conseil_date', true ) ); ?></span>
							</a>
						</li>
					<?php endforeach; ?>
				</ul>
			<?php endif; ?>
		</div>
		<?php
	}

	/**
	 * Écran de réglages.
	 */
	public static function page_reglages() {
		if ( ! current_user_can( 'manage_options' ) ) {
			wp_die( esc_html__( 'Access denied.', 'mairie-affiche-information' ) );
		}

		$reglages = Mairie_Affiche_Information_Reglages::get();
		$roles    = Mairie_Affiche_Information_Capacites::roles_du_site();
		$fond_url         = $reglages['fond_id'] ? wp_get_attachment_image_url( $reglages['fond_id'], 'medium' ) : MAIRIE_AFFICHE_INFORMATION_URL . 'assets/fond_mairie.jpg';
		$conseil_fond_url = $reglages['conseil_fond_id'] ? wp_get_attachment_image_url( $reglages['conseil_fond_id'], 'medium' ) : MAIRIE_AFFICHE_INFORMATION_URL . 'assets/fond_conseil.jpg';
		?>
		<div class="wrap mai-wrap">
			<h1><?php esc_html_e( 'Settings — Town hall notices', 'mairie-affiche-information' ); ?></h1>

			<form method="post" action="options.php">
				<?php settings_fields( 'mairie_affiche_information_groupe' ); ?>

				<h2><?php esc_html_e( 'Access', 'mairie-affiche-information' ); ?></h2>
				<table class="form-table" role="presentation">
					<tr>
						<th scope="row"><?php esc_html_e( 'Allowed roles', 'mairie-affiche-information' ); ?></th>
						<td>
							<fieldset>
								<?php foreach ( $roles as $slug => $nom ) : ?>
									<label style="display:block;margin-bottom:4px">
										<input type="checkbox"
											name="<?php echo esc_attr( MAIRIE_AFFICHE_INFORMATION_OPTION ); ?>[roles][]"
											value="<?php echo esc_attr( $slug ); ?>"
											<?php checked( in_array( $slug, $reglages['roles'], true ) ); ?>
											<?php disabled( 'administrator', $slug ); ?>>
										<?php echo esc_html( translate_user_role( $nom ) ); ?>
										<?php if ( 'administrator' === $slug ) : ?>
											<em><?php esc_html_e( '(always allowed)', 'mairie-affiche-information' ); ?></em>
											<input type="hidden" name="<?php echo esc_attr( MAIRIE_AFFICHE_INFORMATION_OPTION ); ?>[roles][]" value="administrator">
										<?php endif; ?>
									</label>
								<?php endforeach; ?>
							</fieldset>
							<p class="description">
								<?php esc_html_e( 'The “mairie_affiche_information_generer” capability is granted to the checked roles and removed from the others on save.', 'mairie-affiche-information' ); ?>
							</p>
						</td>
					</tr>
				</table>

				<h2><?php esc_html_e( 'Closure notice artwork', 'mairie-affiche-information' ); ?></h2>
				<table class="form-table" role="presentation">
					<tr>
						<th scope="row"><?php esc_html_e( 'Background image', 'mairie-affiche-information' ); ?></th>
						<td>
							<input type="hidden" id="mai-fond-id" name="<?php echo esc_attr( MAIRIE_AFFICHE_INFORMATION_OPTION ); ?>[fond_id]" value="<?php echo esc_attr( $reglages['fond_id'] ); ?>">
							<img id="mai-fond-apercu" src="<?php echo esc_url( $fond_url ); ?>" alt="" style="max-width:220px;height:auto;display:block;margin-bottom:8px">
							<button type="button" class="button" id="mai-choisir-fond"><?php esc_html_e( 'Choose an image', 'mairie-affiche-information' ); ?></button>
							<button type="button" class="button" id="mai-fond-defaut"><?php esc_html_e( 'Bundled background', 'mairie-affiche-information' ); ?></button>
							<p class="description"><?php esc_html_e( 'Square image without a date. If you change the background, adjust the coordinates below.', 'mairie-affiche-information' ); ?></p>
						</td>
					</tr>
					<tr>
						<th scope="row"><label for="mai-centre-x"><?php esc_html_e( 'Horizontal centre (px)', 'mairie-affiche-information' ); ?></label></th>
						<td><input type="number" id="mai-centre-x" name="<?php echo esc_attr( MAIRIE_AFFICHE_INFORMATION_OPTION ); ?>[centre_x]" value="<?php echo esc_attr( $reglages['centre_x'] ); ?>" class="small-text"></td>
					</tr>
					<tr>
						<th scope="row"><label for="mai-ligne-base"><?php esc_html_e( 'Text baseline (px)', 'mairie-affiche-information' ); ?></label></th>
						<td><input type="number" id="mai-ligne-base" name="<?php echo esc_attr( MAIRIE_AFFICHE_INFORMATION_OPTION ); ?>[ligne_base]" value="<?php echo esc_attr( $reglages['ligne_base'] ); ?>" class="small-text"></td>
					</tr>
					<tr>
						<th scope="row"><label for="mai-largeur"><?php esc_html_e( 'Maximum text width (px)', 'mairie-affiche-information' ); ?></label></th>
						<td><input type="number" id="mai-largeur" name="<?php echo esc_attr( MAIRIE_AFFICHE_INFORMATION_OPTION ); ?>[largeur_max]" value="<?php echo esc_attr( $reglages['largeur_max'] ); ?>" class="small-text"></td>
					</tr>
					<tr>
						<th scope="row"><label for="mai-couleur"><?php esc_html_e( 'Date colour', 'mairie-affiche-information' ); ?></label></th>
						<td><input type="color" id="mai-couleur" name="<?php echo esc_attr( MAIRIE_AFFICHE_INFORMATION_OPTION ); ?>[couleur]" value="<?php echo esc_attr( $reglages['couleur'] ); ?>"></td>
					</tr>
					<tr>
						<th scope="row"><label for="mai-qualite"><?php esc_html_e( 'JPEG quality', 'mairie-affiche-information' ); ?></label></th>
						<td><input type="number" id="mai-qualite" name="<?php echo esc_attr( MAIRIE_AFFICHE_INFORMATION_OPTION ); ?>[qualite]" value="<?php echo esc_attr( $reglages['qualite'] ); ?>" min="40" max="100" class="small-text"></td>
					</tr>
					<tr>
						<th scope="row"><label for="mai-format-defaut"><?php esc_html_e( 'Default format', 'mairie-affiche-information' ); ?></label></th>
						<td>
							<select id="mai-format-defaut" name="<?php echo esc_attr( MAIRIE_AFFICHE_INFORMATION_OPTION ); ?>[format]">
								<option value="jpg" <?php selected( $reglages['format'], 'jpg' ); ?>>JPEG</option>
								<option value="png" <?php selected( $reglages['format'], 'png' ); ?>>PNG</option>
							</select>
						</td>
					</tr>
				</table>

				<h2><?php esc_html_e( 'Council meeting', 'mairie-affiche-information' ); ?></h2>
				<table class="form-table" role="presentation">
					<tr>
						<th scope="row"><?php esc_html_e( 'Background image', 'mairie-affiche-information' ); ?></th>
						<td>
							<input type="hidden" id="mai-conseil-fond-id" name="<?php echo esc_attr( MAIRIE_AFFICHE_INFORMATION_OPTION ); ?>[conseil_fond_id]" value="<?php echo esc_attr( $reglages['conseil_fond_id'] ); ?>">
							<img id="mai-conseil-fond-apercu" src="<?php echo esc_url( $conseil_fond_url ); ?>" alt="" style="max-width:220px;height:auto;display:block;margin-bottom:8px">
							<button type="button" class="button" id="mai-conseil-choisir-fond"><?php esc_html_e( 'Choose an image', 'mairie-affiche-information' ); ?></button>
							<button type="button" class="button" id="mai-conseil-fond-defaut"><?php esc_html_e( 'Bundled background', 'mairie-affiche-information' ); ?></button>
						</td>
					</tr>
					<tr>
						<th scope="row"><label for="mai-conseil-lieu"><?php esc_html_e( 'Default venue', 'mairie-affiche-information' ); ?></label></th>
						<td><input type="text" id="mai-conseil-lieu" name="<?php echo esc_attr( MAIRIE_AFFICHE_INFORMATION_OPTION ); ?>[conseil_lieu]" value="<?php echo esc_attr( $reglages['conseil_lieu'] ); ?>" class="regular-text"></td>
					</tr>
					<tr>
						<th scope="row"><label for="mai-conseil-heure"><?php esc_html_e( 'Default time', 'mairie-affiche-information' ); ?></label></th>
						<td><input type="time" id="mai-conseil-heure" name="<?php echo esc_attr( MAIRIE_AFFICHE_INFORMATION_OPTION ); ?>[conseil_heure]" value="<?php echo esc_attr( $reglages['conseil_heure'] ); ?>"></td>
					</tr>
				</table>

				<?php submit_button(); ?>
			</form>
		</div>
		<?php
	}
}
