<?php
/**
 * Plugin Name: MFM Painel
 * Description: Painel administrativo da campanha Maringá Faz Mais moldado pra equipe SECOM: role restrita a Obras e Mídia, menu limpo, dashboard com os contadores do Obrômetro e identidade visual no login.
 * Version: 1.1.0
 * Author: Digimax
 * Requires PHP: 8.0
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

/* --------------------------------------------------------------------------
 * 1. Role "SECOM" — só o que a equipe precisa: criar, editar e publicar
 * Obras (de qualquer autor), usar a Mídia e gerenciar Categorias/Bairros.
 * Sem NENHUMA cap delete_*: obra não se exclui, se oculta (rascunho ou o
 * toggle "Visível") — o bloqueio é de capability, não só de interface.
 * As caps de obra existem porque o CPT usa capability_type próprio
 * (tema, inc/obras.php). Recriada a cada mudança de versão abaixo.
 * ------------------------------------------------------------------------ */

const MFM_PAINEL_VERSAO_ROLE = '1';

function mfm_painel_cria_role() {
	if ( MFM_PAINEL_VERSAO_ROLE === get_option( 'mfm_painel_role' ) ) {
		return;
	}

	remove_role( 'secom' );
	add_role(
		'secom',
		'SECOM',
		array(
			'read'                 => true,
			'upload_files'         => true,
			'edit_obras'           => true,
			'edit_others_obras'    => true,
			'edit_published_obras' => true,
			'publish_obras'        => true,
			'manage_obra_terms'    => true,
		)
	);

	update_option( 'mfm_painel_role', MFM_PAINEL_VERSAO_ROLE );
}
add_action( 'init', 'mfm_painel_cria_role', 12 );

/**
 * Sem edit_posts, o WordPress jogaria a SECOM no Perfil após o login;
 * o lugar dela é o Painel, onde ficam os contadores do Obrômetro.
 */
function mfm_painel_redirect_login( $redirect_to, $requested, $user ) {
	if ( $user instanceof WP_User && in_array( 'secom', (array) $user->roles, true ) ) {
		// index.php explícito: se devolver admin_url() puro, o wp-login.php
		// sobrescreve pra profile.php quando o usuário não tem edit_posts.
		return admin_url( 'index.php' );
	}
	return $redirect_to;
}
add_filter( 'login_redirect', 'mfm_painel_redirect_login', 10, 3 );

/**
 * Anexos: a SECOM não tem caps de Posts, mas precisa editar a própria
 * biblioteca (alt text é requisito de acessibilidade do projeto) e poder
 * apagar um upload errado. Pra ela, editar/excluir anexo exige só
 * upload_files. Obras continuam regidas pelas caps de obra.
 */
function mfm_painel_caps_midia( $caps, $cap, $user_id, $args ) {
	if ( ! in_array( $cap, array( 'edit_post', 'delete_post' ), true ) || empty( $args[0] ) ) {
		return $caps;
	}
	if ( 'attachment' !== get_post_type( $args[0] ) ) {
		return $caps;
	}

	$user = get_userdata( $user_id );
	if ( $user && in_array( 'secom', (array) $user->roles, true ) ) {
		return array( 'upload_files' );
	}

	return $caps;
}
add_filter( 'map_meta_cap', 'mfm_painel_caps_midia', 10, 4 );

/* --------------------------------------------------------------------------
 * 2. Menu e admin bar limpos + comentários desativados.
 * O site não usa blog nem comentários, e as Páginas (Galeria, Mapa) são
 * fixas, montadas pelos templates do tema: Posts, Páginas e Comentários
 * somem do menu pra todo mundo. Pra SECOM, o resto (Aparência, Plugins,
 * Ferramentas, Configurações, Usuários) já não aparece por falta de
 * capability.
 * ------------------------------------------------------------------------ */

function mfm_painel_limpa_menu() {
	remove_menu_page( 'edit.php' );                // Posts.
	remove_menu_page( 'edit.php?post_type=page' ); // Páginas.
	remove_menu_page( 'edit-comments.php' );       // Comentários.
}
add_action( 'admin_menu', 'mfm_painel_limpa_menu', 999 );

function mfm_painel_desativa_comentarios() {
	foreach ( array( 'post', 'page' ) as $tipo ) {
		remove_post_type_support( $tipo, 'comments' );
		remove_post_type_support( $tipo, 'trackbacks' );
	}
}
add_action( 'init', 'mfm_painel_desativa_comentarios', 100 );

add_filter( 'comments_open', '__return_false', 20 );
add_filter( 'pings_open', '__return_false', 20 );
add_filter( 'comments_array', '__return_empty_array', 20 );

function mfm_painel_limpa_admin_bar( $barra ) {
	$barra->remove_node( 'wp-logo' );   // Logo/links do WordPress.org.
	$barra->remove_node( 'comments' );  // Balão de comentários.
	$barra->remove_node( 'new-post' );  // "+ Novo > Post" (Obra e Mídia ficam).
	$barra->remove_node( 'new-page' );  // "+ Novo > Página".
}
add_action( 'admin_bar_menu', 'mfm_painel_limpa_admin_bar', 999 );

/* --------------------------------------------------------------------------
 * 3. Dashboard da campanha — some tudo que é padrão (notícias do
 * WordPress, rascunho rápido, atividade, saúde do site) e entra um widget
 * único com os contadores do Obrômetro + atalho de cadastro.
 * ------------------------------------------------------------------------ */

function mfm_painel_dashboard() {
	global $wp_meta_boxes;
	$wp_meta_boxes['dashboard'] = array();

	remove_action( 'welcome_panel', 'wp_welcome_panel' );

	wp_add_dashboard_widget( 'mfm_resumo', 'Obrômetro — Maringá Faz Mais', 'mfm_painel_widget_resumo' );
}
add_action( 'wp_dashboard_setup', 'mfm_painel_dashboard', 999 );

function mfm_painel_widget_resumo() {
	// mfm_contadores_status() e MFM_STATUS_ROTULOS vivem no tema (inc/obras.php).
	$rotulos = defined( 'MFM_STATUS_ROTULOS' ) ? MFM_STATUS_ROTULOS : array(
		'entregue'  => 'Entregue',
		'andamento' => 'Em andamento',
		'recurso'   => 'Com recurso viabilizado',
		'chegando'  => 'Chegando',
		'planejada' => 'Planejada',
	);
	$contadores = function_exists( 'mfm_contadores_status' ) ? mfm_contadores_status() : array();

	// Um card por status (5 no escopo jul/2026), nas cores dos badges da
	// listagem de obras (admin-obra.css).
	$cores = array(
		'entregue'  => array( '#d4f4dd', '#116329' ),
		'andamento' => array( '#fff3cd', '#7a5b00' ),
		'recurso'   => array( '#ffe8d2', '#9a4b00' ),
		'chegando'  => array( '#d6ecff', '#2A588E' ),
		'planejada' => array( '#d6ecff', '#2A588E' ),
	);

	echo '<div style="display:flex;flex-wrap:wrap;gap:10px;margin:4px 0 16px">';
	foreach ( $rotulos as $status => $rotulo ) {
		list( $fundo, $cor ) = isset( $cores[ $status ] ) ? $cores[ $status ] : array( '#eef2f7', '#0c2e55' );
		printf(
			'<div style="flex:1 1 100px;text-align:center;padding:14px 6px;border-radius:8px;background:%1$s">
				<span style="display:block;font-size:30px;line-height:1.1;font-weight:700;color:%2$s">%3$d</span>
				<span style="display:block;margin-top:4px;font-size:12px;font-weight:600;color:%2$s">%4$s</span>
			</div>',
			esc_attr( $fundo ),
			esc_attr( $cor ),
			(int) ( $contadores[ $status ] ?? 0 ),
			esc_html( $rotulo )
		);
	}
	echo '</div>';

	printf(
		'<p style="display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin:0">
			<a class="button button-primary" style="background:#0c2e55;border-color:#0c2e55" href="%s">+ Cadastrar nova obra</a>
			<a class="button" href="%s">+ Nova atualização</a>
			<a class="button" href="%s">Conteúdo da home</a>
			<a class="button" href="%s">Ver todas as obras</a>
		</p>',
		esc_url( admin_url( 'post-new.php?post_type=obra' ) ),
		esc_url( admin_url( 'post-new.php?post_type=atualizacao' ) ),
		esc_url( admin_url( 'admin.php?page=mfm-home' ) ),
		esc_url( admin_url( 'edit.php?post_type=obra' ) )
	);
}

/* --------------------------------------------------------------------------
 * 4. Identidade visual — login com as cores da campanha (paleta do tema:
 * azul #0c2e55, verde #0FB286) e rodapé do admin com a marca.
 * ------------------------------------------------------------------------ */

// Texto do h1 fica pra leitores de tela; visualmente entra a logo oficial
// (background-image no CSS abaixo, arquivo em assets/img do plugin).
function mfm_painel_login_texto() {
	return 'Maringá Faz Mais';
}
add_filter( 'login_headertext', 'mfm_painel_login_texto' );

function mfm_painel_login_url() {
	return home_url( '/' );
}
add_filter( 'login_headerurl', 'mfm_painel_login_url' );

/**
 * Login sempre em português por padrão: o dropdown de idioma do wp-login
 * abre com pt_BR selecionado mesmo com o site em outro locale ou com
 * cookie de idioma antigo. A escolha explícita no próprio dropdown
 * (?wp_lang=...) continua valendo.
 */
function mfm_painel_login_locale( $locale ) {
	if ( isset( $_GET['wp_lang'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
		return $locale;
	}

	// Detecta o login pela URL da requisição: o $pagenow só é marcado como
	// wp-login.php pelo MFM Segurança no wp_loaded, tarde demais pras
	// traduções do core (load_default_textdomain roda antes).
	$caminho = trim( rawurldecode( (string) wp_parse_url( $_SERVER['REQUEST_URI'] ?? '', PHP_URL_PATH ) ), '/' );
	$slug    = defined( 'MFM_LOGIN_SLUG' ) ? MFM_LOGIN_SLUG : 'acesso-secom';
	$e_login = 'wp-login.php' === ( $GLOBALS['pagenow'] ?? '' )
		|| $slug === $caminho
		|| 'wp-login.php' === basename( $caminho )
		|| substr( $caminho, -strlen( '/' . $slug ) ) === '/' . $slug; // instalação em subdiretório.

	if ( ! $e_login ) {
		return $locale;
	}
	return in_array( 'pt_BR', get_available_languages(), true ) ? 'pt_BR' : $locale;
}
add_filter( 'determine_locale', 'mfm_painel_login_locale' );

function mfm_painel_login_css() {
	$logo = plugins_url( 'assets/img/logo-maringa-faz-mais.png', __FILE__ );
	?>
	<style>
		/* O core imprime o CSS dele depois deste bloco: o prefixo body.login
		   garante a especificidade maior. */
		body.login {
			background: #055087; /* mesmo azul do fundo da logo — ela "flutua" sem emenda */
		}
		/* Logo oficial no lugar do wordmark; o texto do link some da tela
		   mas segue lá pros leitores de tela. */
		body.login h1 a {
			background: url("<?php echo esc_url( $logo ); ?>") no-repeat center / contain;
			width: 260px;
			height: 106px;
			text-indent: -9999px;
			overflow: hidden;
		}
		body.login form {
			border: none;
			border-radius: 10px;
			border-top: 4px solid #0FB286;
			box-shadow: 0 12px 32px rgba(0, 0, 0, 0.35);
		}
		body.login.wp-core-ui .button-primary {
			background: #0FB286;
			border-color: #0FB286;
			color: #fff;
		}
		body.login.wp-core-ui .button-primary:hover,
		body.login.wp-core-ui .button-primary:focus {
			background: #0D9772;
			border-color: #0D9772;
		}
		body.login input:focus {
			border-color: #0FB286;
			box-shadow: 0 0 0 1px #0FB286;
		}
		body.login #nav a,
		body.login #backtoblog a,
		body.login .privacy-policy-page-link a {
			color: #cfe2f7;
		}
		body.login #nav a:hover,
		body.login #backtoblog a:hover {
			color: #fff;
		}
		body.login .message {
			border-left-color: #0FB286;
		}
		/* Erro precisa chamar atenção: vermelho, não a cor da campanha. */
		body.login #login_error {
			border-left: 4px solid #d63638;
			background: #fbeaea;
			color: #7a1c1e;
			font-weight: 600;
		}
	</style>
	<?php
}
add_action( 'login_enqueue_scripts', 'mfm_painel_login_css' );

function mfm_painel_rodape() {
	return 'Obrômetro — Maringá Faz Mais';
}
add_filter( 'admin_footer_text', 'mfm_painel_rodape' );
