<?php
/**
 * Páginas públicas (etapa 4) — listagens, ficha, Mapa de Obras e Galeria.
 *
 * Rotas:
 * - /obras/            → archive do CPT (grade de cards + filtros combinados)
 * - /regiao/{slug}/    → taxonomy-regiao.php (mesma listagem, região travada)
 * - /area/{slug}/      → taxonomy-eixo.php (mesma listagem, eixo travado)
 * - /obras/{slug}/     → single-obra.php (ficha)
 * - /mapa-de-obras/    → página com o template Mapa de Obras
 * - /galeria/          → página com o template Galeria
 *
 * Os submenus do menu principal apontam pra essas mesmas rotas — status via
 * query string (?status=entregue), região/eixo pelos archives de taxonomia.
 */

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

/**
 * Cria as páginas Mapa de Obras e Galeria (uma vez por versão) já com os
 * templates atribuídos — o conteúdo delas vem todo do código/painel, a
 * página só existe pra dar URL e título editável.
 */
function mfm_seed_paginas() {
	if ( get_option( 'mfm_paginas_seed' ) ) {
		return;
	}

	$paginas = array(
		'mapa-de-obras' => array(
			'titulo'   => 'Mapa de Obras',
			'template' => 'page-templates/mapa-obras.php',
		),
		'galeria'       => array(
			'titulo'   => 'Galeria',
			'template' => 'page-templates/galeria.php',
		),
	);

	foreach ( $paginas as $slug => $pagina ) {
		$existente = get_page_by_path( $slug );
		$id        = $existente instanceof WP_Post ? $existente->ID : wp_insert_post(
			array(
				'post_type'   => 'page',
				'post_status' => 'publish',
				'post_title'  => $pagina['titulo'],
				'post_name'   => $slug,
			)
		);
		if ( $id && ! is_wp_error( $id ) ) {
			update_post_meta( $id, '_wp_page_template', $pagina['template'] );
		}
	}

	update_option( 'mfm_paginas_seed', '1' );
}
add_action( 'admin_init', 'mfm_seed_paginas' );

/**
 * URLs das rotas fixas — com fallback pro slug caso a página ainda não
 * tenha sido criada pelo seed.
 */
function mfm_url_mapa() {
	$pagina = get_page_by_path( 'mapa-de-obras' );
	return $pagina instanceof WP_Post ? (string) get_permalink( $pagina ) : home_url( '/mapa-de-obras/' );
}

function mfm_url_galeria() {
	$pagina = get_page_by_path( 'galeria' );
	return $pagina instanceof WP_Post ? (string) get_permalink( $pagina ) : home_url( '/galeria/' );
}

function mfm_url_listagem() {
	$url = get_post_type_archive_link( 'obra' );
	return $url ? $url : home_url( '/obras/' );
}

/**
 * True nas rotas de listagem de obras (archive + taxonomias) — os três
 * templates finos compartilham template-parts/listagem-obras.php.
 */
function mfm_e_listagem_obras() {
	return is_post_type_archive( 'obra' ) || is_tax( array( 'regiao', 'eixo' ) );
}

/**
 * Status escolhido no filtro da listagem (?status=…) — só valores dos 5
 * status valem; qualquer outra coisa cai em ''.
 */
function mfm_status_filtro_atual() {
	$status = sanitize_key( wp_unslash( $_GET['status'] ?? '' ) );
	return isset( mfm_status_rotulos()[ $status ] ) ? $status : '';
}

/**
 * Busca pelo nome digitada no filtro da listagem (?busca=…).
 */
function mfm_busca_filtro_atual() {
	return trim( sanitize_text_field( wp_unslash( $_GET['busca'] ?? '' ) ) );
}

/**
 * Query das listagens públicas: 12 cards por página, mais recentes
 * atualizadas primeiro e filtro de status via query string. Região e eixo
 * o WordPress filtra sozinho — são query vars de taxonomia registrada
 * (/obras/?regiao=norte&eixo=saude combina os dois).
 */
function mfm_listagem_query( $query ) {
	if ( is_admin() || ! $query->is_main_query() ) {
		return;
	}
	if ( ! $query->is_post_type_archive( 'obra' ) && ! $query->is_tax( array( 'regiao', 'eixo' ) ) ) {
		return;
	}

	$query->set( 'post_type', 'obra' );
	$query->set( 'posts_per_page', 12 );
	if ( ! $query->get( 'orderby' ) ) {
		$query->set( 'orderby', 'modified' );
		$query->set( 'order', 'DESC' );
	}

	$status = mfm_status_filtro_atual();
	if ( $status ) {
		$meta_query   = (array) $query->get( 'meta_query' );
		$meta_query[] = array(
			'key'   => 'status',
			'value' => $status,
		);
		$query->set( 'meta_query', $meta_query );
	}

	// Busca pelo nome: 's' setado aqui filtra a listagem sem virar rota de
	// busca (is_search já foi resolvido no parse_query) — só o título conta.
	$busca = mfm_busca_filtro_atual();
	if ( $busca ) {
		$query->set( 's', $busca );
		$query->set( 'search_columns', array( 'post_title' ) );
	}
}
add_action( 'pre_get_posts', 'mfm_listagem_query' );

/**
 * Obra oculta ("Visível" desligado) some das listagens via meta_query, mas
 * o link direto da ficha também precisa sumir — 404 pra quem não edita obras.
 */
function mfm_ficha_obra_oculta() {
	if ( ! is_singular( 'obra' ) || current_user_can( 'edit_obras' ) ) {
		return;
	}
	if ( '0' === get_post_meta( get_queried_object_id(), 'visivel', true ) ) {
		global $wp_query;
		$wp_query->set_404();
		status_header( 404 );
	}
}
add_action( 'template_redirect', 'mfm_ficha_obra_oculta' );

/**
 * Itens da página Galeria — os itens do painel (mfm_home_galeria) mais as
 * fotos cadastradas no campo "Fotos" de cada obra publicada e visível e
 * as fotos das atualizações dessas obras, que entram sozinhas (sem passar
 * pelo painel; a legenda da foto de atualização é o título dela). Tudo com
 * os dados da obra já resolvidos pros filtros (busca pelo nome, região e
 * eixo) e as URLs de imagem prontas pro template. Foto repetida entre as
 * fontes aparece uma vez só.
 */
function mfm_galeria_itens() {
	$itens        = array();
	$fotos_vistas = array();

	// Itens do painel primeiro: são curadoria (vídeos e fotos avulsas).
	foreach ( mfm_home_galeria() as $item ) {
		$obra   = $item['obra'] && 'publish' === get_post_status( $item['obra'] ) ? get_post( $item['obra'] ) : null;
		$eixo   = $obra ? mfm_termo_da_obra( $obra->ID, 'eixo' ) : array( 'nome' => '', 'slug' => '' );
		$regiao = $obra ? mfm_termo_da_obra( $obra->ID, 'regiao' ) : array( 'nome' => '', 'slug' => '' );
		$bairro = $obra ? mfm_termo_da_obra( $obra->ID, 'bairro' ) : array( 'nome' => '', 'slug' => '' );

		$itens[] = array(
			'tipo'          => $item['tipo'],
			'thumb'         => $item['imagem'] ? (string) wp_get_attachment_image_url( $item['imagem'], 'medium_large' ) : '',
			'grande'        => $item['imagem'] ? (string) wp_get_attachment_image_url( $item['imagem'], 'full' ) : '',
			'video'         => $item['video_arquivo'] ? $item['video_arquivo'] : $item['video_url'],
			'legenda'       => $item['legenda'],
			'obra_id'       => $obra ? $obra->ID : 0,
			'obra_titulo'   => $obra ? get_the_title( $obra ) : '',
			'eixo_slug'     => $eixo['slug'],
			'eixo_nome'     => $eixo['nome'],
			'regiao_slug'   => $regiao['slug'],
			'regiao_nome'   => $regiao['nome'],
			'bairro_slug'   => $bairro['slug'],
			'bairro_nome'   => $bairro['nome'],
		);
		if ( 'foto' === $item['tipo'] && $item['imagem'] ) {
			$fotos_vistas[ (int) $item['imagem'] ] = true;
		}
	}

	// Fotos das atualizações, agrupadas pela obra relacionada (a mais
	// recente primeiro) — a legenda é o título da atualização.
	$fotos_de_atualizacao = array();
	$atualizacoes         = get_posts(
		array(
			'post_type'      => 'atualizacao',
			'post_status'    => 'publish',
			'posts_per_page' => -1,
			'orderby'        => 'date',
			'order'          => 'DESC',
		)
	);
	foreach ( $atualizacoes as $atualizacao ) {
		$foto_id = (int) get_post_meta( $atualizacao->ID, 'foto', true );
		$obra_id = (int) get_post_meta( $atualizacao->ID, 'obra_relacionada', true );
		if ( $foto_id && $obra_id ) {
			$fotos_de_atualizacao[ $obra_id ][] = array(
				'id'      => $foto_id,
				'legenda' => get_the_title( $atualizacao ),
			);
		}
	}

	// Fotos do cadastro das obras (e das atualizações de cada uma) —
	// obra movimentada há menos tempo primeiro.
	$obras = get_posts(
		array(
			'post_type'      => 'obra',
			'post_status'    => 'publish',
			'posts_per_page' => -1,
			'orderby'        => 'modified',
			'order'          => 'DESC',
			'meta_query'     => array( mfm_clausula_visivel() ),
		)
	);
	foreach ( $obras as $obra ) {
		$fotos = array();
		foreach ( array_filter( array_map( 'intval', (array) get_post_meta( $obra->ID, 'galeria', true ) ) ) as $foto_id ) {
			$fotos[] = array(
				'id'      => $foto_id,
				'legenda' => (string) wp_get_attachment_caption( $foto_id ),
			);
		}
		$fotos = array_merge( $fotos, $fotos_de_atualizacao[ $obra->ID ] ?? array() );
		if ( ! $fotos ) {
			continue;
		}

		$eixo   = mfm_termo_da_obra( $obra->ID, 'eixo' );
		$regiao = mfm_termo_da_obra( $obra->ID, 'regiao' );
		$bairro = mfm_termo_da_obra( $obra->ID, 'bairro' );

		foreach ( $fotos as $foto ) {
			if ( isset( $fotos_vistas[ $foto['id'] ] ) || ! wp_attachment_is_image( $foto['id'] ) ) {
				continue;
			}
			$fotos_vistas[ $foto['id'] ] = true;

			$itens[] = array(
				'tipo'          => 'foto',
				'thumb'         => (string) wp_get_attachment_image_url( $foto['id'], 'medium_large' ),
				'grande'        => (string) wp_get_attachment_image_url( $foto['id'], 'full' ),
				'video'         => '',
				'legenda'       => $foto['legenda'],
				'obra_id'       => $obra->ID,
				'obra_titulo'   => get_the_title( $obra ),
				'eixo_slug'     => $eixo['slug'],
				'eixo_nome'     => $eixo['nome'],
				'regiao_slug'   => $regiao['slug'],
				'regiao_nome'   => $regiao['nome'],
				'bairro_slug'   => $bairro['slug'],
				'bairro_nome'   => $bairro['nome'],
			);
		}
	}

	return $itens;
}

/**
 * Etapas da linha de andamento da ficha, com o estado de cada uma
 * (concluída / atual / futura) a partir da etapa salva na obra.
 */
function mfm_etapas_da_obra( $obra_id ) {
	$atual  = (string) get_post_meta( $obra_id, 'etapa_andamento', true );
	$chaves = array_keys( MFM_ETAPAS_ROTULOS );
	$indice = array_search( $atual, $chaves, true );
	if ( false === $indice ) {
		$indice = 0;
	}

	$etapas = array();
	foreach ( $chaves as $i => $chave ) {
		$estado = 'futura';
		if ( $i < $indice ) {
			$estado = 'concluida';
		} elseif ( $i === $indice ) {
			// A etapa Entrega só fecha de fato quando a obra está entregue.
			$estado = ( 'entrega' === $chave && 'entregue' === get_post_meta( $obra_id, 'status', true ) ) ? 'concluida' : 'atual';
		}
		$etapas[] = array(
			'chave'  => $chave,
			'rotulo' => MFM_ETAPAS_ROTULOS[ $chave ],
			'estado' => $estado,
		);
	}
	return $etapas;
}

/**
 * Atualizações (notícias) de uma obra, mais recentes primeiro — a data do
 * post já é sincronizada com o campo "data" (inc/atualizacoes.php).
 */
function mfm_atualizacoes_da_obra( $obra_id, $limite = 6 ) {
	return get_posts(
		array(
			'post_type'      => 'atualizacao',
			'post_status'    => 'publish',
			'posts_per_page' => (int) $limite,
			'orderby'        => 'date',
			'order'          => 'DESC',
			'meta_query'     => array(
				array(
					'key'   => 'obra_relacionada',
					'value' => $obra_id,
				),
			),
		)
	);
}
