<?php
/**
 * Migração v1 → v2 do modelo de dados (escopo jul/2026). Roda UMA vez
 * (guardada por option) no primeiro admin_init — ou manualmente via
 * `wp eval 'mfm_migracao_v2();'`.
 *
 * O que ela faz, sem apagar nada:
 * 1. Termos-pai de bairro ganham os nomes das regiões fixas
 *    ("Zona Norte" → "Norte" etc.) e "Distritos" é criado.
 * 2. Cada obra com termo da taxonomia aposentada "categoria_obra" recebe
 *    o eixo equivalente (mapa de → para documentado abaixo).
 * 3. Obra com bairro e sem região herda a região do termo-pai do bairro.
 * 4. Obra sem "etapa_andamento" ganha a etapa coerente com o status
 *    (entregue → Entrega, andamento → Execução, resto → Planejamento).
 * 5. Entradas do repeater "linha_do_tempo" viram posts do CPT
 *    "atualizacao". As metas antigas ficam no banco como histórico.
 *
 * Os status antigos (planejada/andamento/entregue) mantêm as mesmas
 * chaves no select novo de 5 valores — nenhuma obra precisa de migração
 * de status nem de recadastro.
 */

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

const MFM_MIGRACAO_V2 = '1';

function mfm_migracao_v2_pendente() {
	return MFM_MIGRACAO_V2 !== get_option( 'mfm_migracao_v2' );
}

function mfm_migracao_v2_agenda() {
	if ( mfm_migracao_v2_pendente() ) {
		mfm_migracao_v2();
	}
}
// Depois do seed dos termos fixos (admin_init 10, inc/obras.php).
add_action( 'admin_init', 'mfm_migracao_v2_agenda', 20 );

/**
 * De → para: categoria antiga (slug) → eixo fixo novo (nome).
 * Mapeamentos sem equivalente exato, decididos pelo contexto da campanha:
 * Lazer → Esporte (praças/lazer contam no eixo esportivo), Habitação →
 * Infraestrutura (moradias) e Segurança → Tecnologia (videomonitoramento).
 * Ajustar aqui se o cliente pedir outra correspondência.
 */
function mfm_migracao_v2_mapa_eixos() {
	return array(
		'infraestrutura'     => 'Infraestrutura',
		'saude'              => 'Saúde',
		'educacao'           => 'Educação',
		'lazer'              => 'Esporte',
		'mobilidade'         => 'Mobilidade',
		'habitacao'          => 'Infraestrutura',
		'esporte'            => 'Esporte',
		'meio-ambiente'      => 'Sustentabilidade',
		'seguranca'          => 'Tecnologia',
		'assistencia-social' => 'Assistência Social',
	);
}

function mfm_migracao_v2() {
	if ( ! mfm_migracao_v2_pendente() ) {
		return;
	}

	// Termos fixos primeiro (idempotente — o guard é outro option).
	mfm_seed_termos();

	mfm_migracao_v2_renomeia_zonas();

	$obras = get_posts(
		array(
			'post_type'      => 'obra',
			'post_status'    => 'any',
			'posts_per_page' => -1,
		)
	);

	foreach ( $obras as $obra ) {
		mfm_migracao_v2_eixo( $obra->ID );
		mfm_migracao_v2_regiao( $obra->ID );
		mfm_migracao_v2_etapa( $obra->ID );
		mfm_migracao_v2_linha_do_tempo( $obra->ID );
	}

	delete_transient( 'mfm_contadores' );
	update_option( 'mfm_migracao_v2', MFM_MIGRACAO_V2 );
}

/**
 * 1. "Zona Norte" → "Norte" etc. Como o seed (que roda antes) já criou os
 * termos-pai com nome de região, a zona antiga é MESCLADA no termo novo:
 * bairros-filho e obras vinculadas mudam pro termo novo e a zona antiga
 * sai — sem isso o rename falharia por nome duplicado e ficariam os dois.
 */
function mfm_migracao_v2_renomeia_zonas() {
	$renomeia = array(
		'Zona Norte' => 'Norte',
		'Zona Sul'   => 'Sul',
		'Zona Leste' => 'Leste',
		'Zona Oeste' => 'Oeste',
	);

	foreach ( $renomeia as $antigo => $novo ) {
		$termo_antigo = get_term_by( 'name', $antigo, 'bairro' );
		if ( ! $termo_antigo instanceof WP_Term ) {
			continue;
		}

		$termo_novo = get_term_by( 'name', $novo, 'bairro' );
		if ( ! $termo_novo instanceof WP_Term ) {
			// Termo novo ainda não existe: rename simples resolve.
			wp_update_term(
				$termo_antigo->term_id,
				'bairro',
				array(
					'name' => $novo,
					'slug' => sanitize_title( $novo ),
				)
			);
			continue;
		}

		// Bairros-filho da zona antiga passam pro termo novo.
		$filhos = get_terms(
			array(
				'taxonomy'   => 'bairro',
				'parent'     => $termo_antigo->term_id,
				'hide_empty' => false,
			)
		);
		if ( is_array( $filhos ) ) {
			foreach ( $filhos as $filho ) {
				wp_update_term( $filho->term_id, 'bairro', array( 'parent' => $termo_novo->term_id ) );
			}
		}

		// Obras marcadas direto na zona antiga passam pro termo novo.
		$obras = get_objects_in_term( $termo_antigo->term_id, 'bairro' );
		if ( is_array( $obras ) ) {
			foreach ( $obras as $obra_id ) {
				wp_remove_object_terms( (int) $obra_id, $termo_antigo->term_id, 'bairro' );
				wp_add_object_terms( (int) $obra_id, $termo_novo->term_id, 'bairro' );
				if ( (int) get_post_meta( (int) $obra_id, 'bairro', true ) === $termo_antigo->term_id ) {
					update_post_meta( (int) $obra_id, 'bairro', $termo_novo->term_id );
				}
			}
		}

		wp_delete_term( $termo_antigo->term_id, 'bairro' );
	}
}

/**
 * 2. categoria_obra → eixo (termo + meta do campo ACF).
 */
function mfm_migracao_v2_eixo( $post_id ) {
	if ( has_term( '', 'eixo', $post_id ) ) {
		return; // Já tem eixo — nada a migrar.
	}

	$categorias = get_the_terms( $post_id, 'categoria_obra' );
	if ( ! $categorias || is_wp_error( $categorias ) ) {
		return;
	}

	$mapa = mfm_migracao_v2_mapa_eixos();
	if ( ! isset( $mapa[ $categorias[0]->slug ] ) ) {
		return;
	}

	$eixo = get_term_by( 'name', $mapa[ $categorias[0]->slug ], 'eixo' );
	if ( ! $eixo instanceof WP_Term ) {
		return;
	}

	wp_set_object_terms( $post_id, $eixo->term_id, 'eixo' );
	update_post_meta( $post_id, 'eixo', $eixo->term_id );
	update_post_meta( $post_id, '_eixo', 'field_mfm_eixo' );
}

/**
 * 3. Região herdada do termo-pai do bairro (mfm_regiao_do_bairro,
 * inc/obras.php).
 */
function mfm_migracao_v2_regiao( $post_id ) {
	if ( has_term( '', 'regiao', $post_id ) ) {
		return;
	}

	$regiao = mfm_regiao_do_bairro( $post_id );
	if ( ! $regiao ) {
		return;
	}

	wp_set_object_terms( $post_id, $regiao->term_id, 'regiao' );
	update_post_meta( $post_id, 'regiao', $regiao->term_id );
	update_post_meta( $post_id, '_regiao', 'field_mfm_regiao' );
}

/**
 * 4. Etapa do andamento coerente com o status atual.
 */
function mfm_migracao_v2_etapa( $post_id ) {
	if ( get_post_meta( $post_id, 'etapa_andamento', true ) ) {
		return;
	}

	$por_status = array(
		'entregue'  => 'entrega',
		'andamento' => 'execucao',
	);
	$status = get_post_meta( $post_id, 'status', true );
	$etapa  = $por_status[ $status ] ?? 'planejamento';

	update_post_meta( $post_id, 'etapa_andamento', $etapa );
	update_post_meta( $post_id, '_etapa_andamento', 'field_mfm_etapa_andamento' );
}

/**
 * 5. Cada linha do repeater "linha_do_tempo" vira um post "atualizacao"
 * ligado à obra. As metas do repeater ficam no banco como histórico
 * (filosofia do projeto: nunca apagar).
 */
function mfm_migracao_v2_linha_do_tempo( $post_id ) {
	$total = (int) get_post_meta( $post_id, 'linha_do_tempo', true );
	if ( ! $total ) {
		return;
	}

	for ( $i = 0; $i < $total; $i++ ) {
		$data  = (string) get_post_meta( $post_id, "linha_do_tempo_{$i}_data", true );  // Ymd.
		$foto  = (int) get_post_meta( $post_id, "linha_do_tempo_{$i}_foto", true );
		$texto = (string) get_post_meta( $post_id, "linha_do_tempo_{$i}_texto", true );

		if ( '' === $texto && ! $foto ) {
			continue; // Linha vazia.
		}

		$data_br = ( 8 === strlen( $data ) )
			? sprintf( '%s/%s/%s', substr( $data, 6, 2 ), substr( $data, 4, 2 ), substr( $data, 0, 4 ) )
			: '';
		$titulo  = $texto ? wp_trim_words( $texto, 8, '…' ) : 'Atualização' . ( $data_br ? " — {$data_br}" : '' );

		$args = array(
			'post_type'   => 'atualizacao',
			'post_status' => 'publish',
			'post_title'  => $titulo,
		);
		if ( 8 === strlen( $data ) ) {
			$post_date              = sprintf( '%s-%s-%s 12:00:00', substr( $data, 0, 4 ), substr( $data, 4, 2 ), substr( $data, 6, 2 ) );
			$args['post_date']      = $post_date;
			$args['post_date_gmt']  = get_gmt_from_date( $post_date );
		}

		$atualizacao_id = wp_insert_post( $args );
		if ( ! $atualizacao_id || is_wp_error( $atualizacao_id ) ) {
			continue;
		}

		update_post_meta( $atualizacao_id, 'obra_relacionada', $post_id );
		update_post_meta( $atualizacao_id, '_obra_relacionada', 'field_mfm_atu_obra' );
		update_post_meta( $atualizacao_id, 'data', $data );
		update_post_meta( $atualizacao_id, '_data', 'field_mfm_atu_data' );
		update_post_meta( $atualizacao_id, 'foto', $foto ?: '' );
		update_post_meta( $atualizacao_id, '_foto', 'field_mfm_atu_foto' );
		update_post_meta( $atualizacao_id, 'texto', $texto );
		update_post_meta( $atualizacao_id, '_texto', 'field_mfm_atu_texto' );
		// Rastro da origem, pra auditoria (obra + índice da linha).
		update_post_meta( $atualizacao_id, '_mfm_migrada_de', "{$post_id}:{$i}" );
	}

	// Zera o contador do repeater: o formulário não tem mais o campo e as
	// linhas já viraram atualizações. As metas linha_do_tempo_N_* ficam.
	update_post_meta( $post_id, 'linha_do_tempo', 0 );
}
