<?php
/**
 * CPT "Atualização" — notícias por obra (escopo jul/2026).
 *
 * Substitui o repeater "linha do tempo" do cadastro da obra: cada avanço
 * vira um post próprio (título, data, foto, texto e obra relacionada
 * obrigatória), exibido na ficha da obra e disponível pra destaque na home.
 *
 * Reusa as capabilities de obra (edit_obras etc.): quem cadastra obra
 * cadastra atualização — a role SECOM entra sem mudança de role. Sem caps
 * delete_*, a SECOM também não exclui atualizações.
 */

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

function mfm_registra_atualizacao() {
	register_post_type(
		'atualizacao',
		array(
			'labels'          => array(
				'name'               => 'Atualizações',
				'singular_name'      => 'Atualização',
				'add_new'            => 'Cadastrar nova',
				'add_new_item'       => 'Cadastrar atualização',
				'edit_item'          => 'Editar atualização',
				'new_item'           => 'Nova atualização',
				'view_item'          => 'Ver no site',
				'search_items'       => 'Buscar atualizações',
				'not_found'          => 'Nenhuma atualização cadastrada ainda.',
				'not_found_in_trash' => 'Nenhuma atualização na lixeira.',
				'all_items'          => 'Todas as atualizações',
			),
			'public'          => true,
			'menu_position'   => 5,
			'menu_icon'       => 'dashicons-megaphone',
			'supports'        => array( 'title' ),
			'has_archive'     => false,
			'capability_type' => array( 'obra', 'obras' ),
			'map_meta_cap'    => true,
			'rewrite'         => array(
				'slug'       => 'atualizacoes',
				'with_front' => false,
			),
			'show_in_rest'    => false, // editor clássico: tela mais simples pra SECOM.
		)
	);
}
add_action( 'init', 'mfm_registra_atualizacao' );

/**
 * Campos da atualização (ACF / Secure Custom Fields).
 */
function mfm_registra_campos_atualizacao() {
	if ( ! function_exists( 'acf_add_local_field_group' ) ) {
		return;
	}

	acf_add_local_field_group(
		array(
			'key'      => 'group_mfm_atualizacao',
			'title'    => 'Atualização da obra',
			'location' => array(
				array(
					array(
						'param'    => 'post_type',
						'operator' => '==',
						'value'    => 'atualizacao',
					),
				),
			),
			'position' => 'acf_after_title',
			'fields'   => array(

				array(
					'key'           => 'field_mfm_atu_obra',
					'name'          => 'obra_relacionada',
					'label'         => 'Obra relacionada',
					'type'          => 'post_object',
					'instructions'  => 'A qual obra esta atualização pertence — obrigatório.',
					'post_type'     => array( 'obra' ),
					'return_format' => 'id',
					'allow_null'    => 0,
					'required'      => 1,
					'wrapper'       => array( 'width' => '50' ),
				),
				array(
					'key'            => 'field_mfm_atu_data',
					'name'           => 'data',
					'label'          => 'Data',
					'type'           => 'date_picker',
					'display_format' => 'd/m/Y',
					'return_format'  => 'Ymd',
					'first_day'      => 0,
					'required'       => 1,
					'wrapper'        => array( 'width' => '50' ),
				),
				array(
					'key'           => 'field_mfm_atu_foto',
					'name'          => 'foto',
					'label'         => 'Foto',
					'type'          => 'image',
					'instructions'  => 'Foto do avanço — aparece no bloco de atualizações da página da obra. Prefira WebP ou JPG.',
					'return_format' => 'id',
					'preview_size'  => 'medium',
					'mime_types'    => 'jpg, jpeg, png, webp',
				),
				array(
					'key'          => 'field_mfm_atu_texto',
					'name'         => 'texto',
					'label'        => 'Texto',
					'type'         => 'textarea',
					'instructions' => 'O que aconteceu. O começo aparece no bloco da ficha; o restante abre no "Ler mais".',
					'rows'         => 5,
					'required'     => 1,
					'new_lines'    => 'wpautop',
				),

				// ----- Atalho: já atualiza a situação da obra junto --------
				array(
					'key'      => 'field_mfm_atu_aviso_obra',
					'label'    => 'Atualizar a obra junto (opcional)',
					'type'     => 'message',
					'message'  => 'Se este avanço mudou a situação da obra, ajuste aqui — ao salvar, os valores são aplicados na obra relacionada. Campo em branco não mexe em nada.',
					'esc_html' => 1,
				),
				array(
					'key'          => 'field_mfm_atu_progresso',
					'name'         => 'nova_porcentagem',
					'label'        => '% de progresso',
					'type'         => 'number',
					'instructions' => 'Novo percentual da barra.',
					'min'          => 0,
					'max'          => 100,
					'step'         => 1,
					'append'       => '%',
					'wrapper'      => array( 'width' => '34' ),
				),
				array(
					'key'           => 'field_mfm_atu_status',
					'name'          => 'novo_status',
					'label'         => 'Status',
					'type'          => 'select',
					'choices'       => mfm_status_rotulos(),
					'default_value' => '',
					'allow_null'    => 1,
					'placeholder'   => 'Manter como está',
					'return_format' => 'value',
					'wrapper'       => array( 'width' => '33' ),
				),
				array(
					'key'           => 'field_mfm_atu_etapa',
					'name'          => 'nova_etapa',
					'label'         => 'Etapa do andamento',
					'type'          => 'select',
					'choices'       => MFM_ETAPAS_ROTULOS,
					'default_value' => '',
					'allow_null'    => 1,
					'placeholder'   => 'Manter como está',
					'return_format' => 'value',
					'wrapper'       => array( 'width' => '33' ),
				),
				array(
					'key'          => 'field_mfm_atu_etapa_atual',
					'name'         => 'nova_etapa_atual',
					'label'        => 'Etapa atual (texto livre)',
					'type'         => 'text',
					'instructions' => 'Substitui o complemento curto exibido na página da obra. Ex.: "Pavimentação iniciada em 12/07."',
					'maxlength'    => 200,
				),
			),
		)
	);
}
add_action( 'acf/init', 'mfm_registra_campos_atualizacao' );

/**
 * A data informada vira a data do post: as listagens (admin e site)
 * ficam em ordem cronológica sem depender de meta_query.
 */
function mfm_atualizacao_sincroniza_data( $post_id ) {
	if ( 'atualizacao' !== get_post_type( $post_id ) ) {
		return;
	}

	$data = get_post_meta( $post_id, 'data', true ); // Ymd.
	if ( ! $data || 8 !== strlen( $data ) ) {
		return;
	}

	$post_date = sprintf( '%s-%s-%s 12:00:00', substr( $data, 0, 4 ), substr( $data, 4, 2 ), substr( $data, 6, 2 ) );
	if ( get_post_field( 'post_date', $post_id ) === $post_date ) {
		return;
	}

	// remove_action evita loop: wp_update_post dispara acf/save_post de novo.
	remove_action( 'acf/save_post', 'mfm_atualizacao_sincroniza_data', 20 );
	wp_update_post(
		array(
			'ID'            => $post_id,
			'post_date'     => $post_date,
			'post_date_gmt' => get_gmt_from_date( $post_date ),
		)
	);
	add_action( 'acf/save_post', 'mfm_atualizacao_sincroniza_data', 20 );
}
add_action( 'acf/save_post', 'mfm_atualizacao_sincroniza_data', 20 );

/**
 * Atalho "atualizar a obra junto": aplica % de progresso, status e etapa
 * preenchidos na atualização direto na obra relacionada, rodando as regras
 * de negócio do salvamento (entregue → 100% etc.) e marcando a obra como
 * modificada — o que a sobe na fila dos destaques da home.
 *
 * Os campos são comando de uma vez só: depois de aplicar, ficam em branco
 * pra uma edição futura da atualização não reaplicar valores velhos.
 */
function mfm_atualizacao_aplica_na_obra( $post_id ) {
	if ( 'atualizacao' !== get_post_type( $post_id ) ) {
		return;
	}

	$obra_id = (int) get_post_meta( $post_id, 'obra_relacionada', true );
	if ( ! $obra_id || 'obra' !== get_post_type( $obra_id ) ) {
		return;
	}

	$progresso   = get_post_meta( $post_id, 'nova_porcentagem', true );
	$status      = (string) get_post_meta( $post_id, 'novo_status', true );
	$etapa       = (string) get_post_meta( $post_id, 'nova_etapa', true );
	$etapa_atual = trim( (string) get_post_meta( $post_id, 'nova_etapa_atual', true ) );

	$mudou = false;
	if ( '' !== (string) $progresso ) {
		update_field( 'progresso', min( 100, max( 0, (int) $progresso ) ), $obra_id );
		$mudou = true;
	}
	if ( $status && isset( mfm_status_rotulos()[ $status ] ) ) {
		update_field( 'status', $status, $obra_id );
		$mudou = true;
	}
	if ( $etapa && isset( MFM_ETAPAS_ROTULOS[ $etapa ] ) ) {
		update_field( 'etapa_andamento', $etapa, $obra_id );
		$mudou = true;
	}
	if ( '' !== $etapa_atual ) {
		update_field( 'etapa_atual', $etapa_atual, $obra_id );
		$mudou = true;
	}

	if ( $mudou ) {
		mfm_obra_ao_salvar( $obra_id );
		// Carimba a modificação da obra: reordena os destaques da home.
		wp_update_post( array( 'ID' => $obra_id ) );
	}

	delete_post_meta( $post_id, 'nova_porcentagem' );
	delete_post_meta( $post_id, 'novo_status' );
	delete_post_meta( $post_id, 'nova_etapa' );
	delete_post_meta( $post_id, 'nova_etapa_atual' );
}
add_action( 'acf/save_post', 'mfm_atualizacao_aplica_na_obra', 21 );

/**
 * Placeholder do título.
 */
function mfm_atualizacao_placeholder_titulo( $texto, $post ) {
	return 'atualizacao' === $post->post_type ? 'Título da atualização — ex.: "Pavimentação concluída"' : $texto;
}
add_filter( 'enter_title_here', 'mfm_atualizacao_placeholder_titulo', 10, 2 );

/* -------------------------------------------------------------------------
 * Admin: lista de atualizações amigável pra SECOM.
 * ---------------------------------------------------------------------- */

function mfm_atualizacao_colunas( $colunas ) {
	return array(
		'cb'         => $colunas['cb'],
		'mfm_foto'   => 'Foto',
		'title'      => 'Título',
		'mfm_obra'   => 'Obra relacionada',
		'mfm_data'   => 'Data',
	);
}
add_filter( 'manage_atualizacao_posts_columns', 'mfm_atualizacao_colunas' );

function mfm_atualizacao_coluna_conteudo( $coluna, $post_id ) {
	switch ( $coluna ) {
		case 'mfm_foto':
			$foto_id = (int) get_post_meta( $post_id, 'foto', true );
			$thumb   = $foto_id ? wp_get_attachment_image( $foto_id, array( 60, 45 ) ) : '';
			if ( ! $thumb ) {
				$thumb = '<span class="mfm-capa--vazia dashicons dashicons-megaphone" title="Sem foto"></span>';
			}
			printf(
				'<a class="mfm-capa" href="%s" aria-label="Editar atualização">%s</a>',
				esc_url( (string) get_edit_post_link( $post_id ) ),
				$thumb // wp_get_attachment_image já vem escapado.
			);
			break;

		case 'mfm_obra':
			$obra_id = (int) get_post_meta( $post_id, 'obra_relacionada', true );
			if ( $obra_id && get_post( $obra_id ) ) {
				printf(
					'<a href="%s">%s</a>',
					esc_url( (string) get_edit_post_link( $obra_id ) ),
					esc_html( get_the_title( $obra_id ) )
				);
			} else {
				echo '<span class="mfm-oculta">sem obra</span>';
			}
			break;

		case 'mfm_data':
			$data = get_post_meta( $post_id, 'data', true );
			if ( $data && 8 === strlen( $data ) ) {
				printf( '%s/%s/%s', esc_html( substr( $data, 6, 2 ) ), esc_html( substr( $data, 4, 2 ) ), esc_html( substr( $data, 0, 4 ) ) );
			} else {
				echo '—';
			}
			break;
	}
}
add_action( 'manage_atualizacao_posts_custom_column', 'mfm_atualizacao_coluna_conteudo', 10, 2 );

/**
 * Filtro por obra no topo da lista de atualizações.
 */
function mfm_atualizacao_filtros_lista() {
	if ( 'atualizacao' !== get_current_screen()->post_type ) {
		return;
	}

	$obra_atual = (int) ( $_GET['mfm_obra'] ?? 0 );
	$obras      = get_posts(
		array(
			'post_type'      => 'obra',
			'post_status'    => 'publish',
			'posts_per_page' => -1,
			'orderby'        => 'title',
			'order'          => 'ASC',
		)
	);

	echo '<select name="mfm_obra"><option value="">Todas as obras</option>';
	foreach ( $obras as $obra ) {
		printf(
			'<option value="%d"%s>%s</option>',
			(int) $obra->ID,
			selected( $obra_atual, $obra->ID, false ),
			esc_html( $obra->post_title )
		);
	}
	echo '</select>';
}
add_action( 'restrict_manage_posts', 'mfm_atualizacao_filtros_lista' );

function mfm_atualizacao_aplica_filtros( $query ) {
	global $typenow;
	if ( ! is_admin() || 'atualizacao' !== $typenow || ! $query->is_main_query() ) {
		return;
	}

	$obra_id = (int) ( $_GET['mfm_obra'] ?? 0 );
	if ( $obra_id ) {
		$meta_query   = (array) $query->get( 'meta_query' );
		$meta_query[] = array(
			'key'   => 'obra_relacionada',
			'value' => $obra_id,
		);
		$query->set( 'meta_query', $meta_query );
	}
}
add_action( 'pre_get_posts', 'mfm_atualizacao_aplica_filtros' );

/**
 * Atualização também não se exclui pela SECOM (sem caps de delete) — tira
 * a lixeira da lista pra quem não é administrador, como nas obras.
 */
function mfm_atualizacao_sem_lixeira( $acoes, $post ) {
	if ( 'atualizacao' !== $post->post_type ) {
		return $acoes;
	}
	// "Edição rápida" sai pra todos, como nas obras: salva por fora do
	// formulário e pularia a sincronização de data da atualização.
	unset( $acoes['inline hide-if-no-js'] );
	if ( ! current_user_can( 'manage_options' ) ) {
		unset( $acoes['trash'] );
	}
	return $acoes;
}
add_filter( 'post_row_actions', 'mfm_atualizacao_sem_lixeira', 10, 2 );
