<?php
/**
 * Réglages du plugin.
 */

defined( 'ABSPATH' ) || exit;

/**
 * Lecture / écriture / validation des réglages.
 */
class Mairie_Affiche_Information_Reglages {

	/**
	 * Valeurs par défaut.
	 *
	 * @return array
	 */
	public static function defauts() {
		return array(
			'roles'       => array( 'administrator' ),
			'fond_id'     => 0,      // Pièce jointe utilisée comme fond ; 0 = fond fourni.
			'centre_x'    => 627,
			'ligne_base'  => 675,
			'largeur_max' => 965,
			'couleur'     => '#a80102',
			'qualite'     => 92,
			'format'      => 'jpg',

			// Conseil municipal.
			'conseil_fond_id' => 0,
			'conseil_lieu'    => 'En salle polyvalente',
			'conseil_heure'   => '20:00',
		);
	}

	/**
	 * Réglages courants, complétés par les valeurs par défaut.
	 *
	 * @return array
	 */
	public static function get() {
		$reglages = get_option( MAIRIE_AFFICHE_INFORMATION_OPTION, array() );
		if ( ! is_array( $reglages ) ) {
			$reglages = array();
		}
		return wp_parse_args( $reglages, self::defauts() );
	}

	/**
	 * Validation avant enregistrement.
	 *
	 * @param array $entree Données brutes du formulaire.
	 * @return array
	 */
	public static function valider( $entree ) {
		$defauts = self::defauts();
		$sortie  = self::get();

		// Rôles : uniquement ceux qui existent réellement sur ce site.
		$roles_site = array_keys( wp_roles()->get_names() );
		$roles      = isset( $entree['roles'] ) && is_array( $entree['roles'] ) ? $entree['roles'] : array();
		$roles      = array_values( array_intersect( array_map( 'sanitize_key', $roles ), $roles_site ) );
		if ( ! in_array( 'administrator', $roles, true ) ) {
			$roles[] = 'administrator'; // L'administrateur garde toujours l'accès.
		}
		$sortie['roles'] = $roles;

		$sortie['fond_id']     = isset( $entree['fond_id'] ) ? absint( $entree['fond_id'] ) : 0;
		$sortie['centre_x']    = isset( $entree['centre_x'] ) ? absint( $entree['centre_x'] ) : $defauts['centre_x'];
		$sortie['ligne_base']  = isset( $entree['ligne_base'] ) ? absint( $entree['ligne_base'] ) : $defauts['ligne_base'];
		$sortie['largeur_max'] = isset( $entree['largeur_max'] ) ? max( 50, absint( $entree['largeur_max'] ) ) : $defauts['largeur_max'];
		$sortie['qualite']     = isset( $entree['qualite'] ) ? min( 100, max( 40, absint( $entree['qualite'] ) ) ) : $defauts['qualite'];
		$sortie['format']      = ( isset( $entree['format'] ) && 'png' === $entree['format'] ) ? 'png' : 'jpg';

		$sortie['conseil_fond_id'] = isset( $entree['conseil_fond_id'] ) ? absint( $entree['conseil_fond_id'] ) : 0;

		$lieu                   = isset( $entree['conseil_lieu'] ) ? sanitize_text_field( $entree['conseil_lieu'] ) : '';
		$sortie['conseil_lieu'] = '' !== $lieu ? $lieu : $defauts['conseil_lieu'];

		$heure                   = isset( $entree['conseil_heure'] ) ? sanitize_text_field( $entree['conseil_heure'] ) : '';
		$sortie['conseil_heure'] = preg_match( '/^\d{1,2}:\d{2}$/', $heure ) ? $heure : $defauts['conseil_heure'];

		$couleur           = isset( $entree['couleur'] ) ? sanitize_hex_color( $entree['couleur'] ) : '';
		$sortie['couleur'] = $couleur ? $couleur : $defauts['couleur'];

		// La synchronisation de la capacité est déclenchée par les accroches
		// add_option_ / update_option_ : un sanitize_callback doit rester pur,
		// WordPress pouvant l'exécuter plusieurs fois pour un même envoi.
		return $sortie;
	}

	/**
	 * Convertit une couleur hexadécimale en composantes RVB.
	 *
	 * @param string $hex Couleur au format #rrggbb.
	 * @return int[]
	 */
	public static function hex_vers_rvb( $hex ) {
		$hex = ltrim( (string) $hex, '#' );
		if ( 3 === strlen( $hex ) ) {
			$hex = $hex[0] . $hex[0] . $hex[1] . $hex[1] . $hex[2] . $hex[2];
		}
		if ( 6 !== strlen( $hex ) ) {
			return array( 168, 1, 2 );
		}
		return array(
			hexdec( substr( $hex, 0, 2 ) ),
			hexdec( substr( $hex, 2, 2 ) ),
			hexdec( substr( $hex, 4, 2 ) ),
		);
	}
}
