<?php
/**
 * Gerenciamento de Eventos - Culturando
 * Integração nativa com Parceiros
 */

// Evita acesso direto ao arquivo
if ( ! defined( 'ABSPATH' ) ) exit;

// Hook para registrar o CPT
add_action( 'init', 'culturando_register_events_cpt' );

function culturando_register_events_cpt() {
    
    // Labels em português
    $labels = array(
        'name'                  => 'Eventos',
        'singular_name'         => 'Evento',
        'menu_name'             => 'Eventos',
        'add_new'               => 'Novo Evento',
        'add_new_item'          => 'Adicionar Novo Evento',
        'edit_item'             => 'Editar Evento',
        'new_item'              => 'Novo Evento',
        'view_item'             => 'Ver Evento',
        'search_items'          => 'Buscar Eventos',
        'not_found'             => 'Nenhum evento encontrado',
        'not_found_in_trash'    => 'Nenhum evento na lixeira',
    );

    $args = array(
        'labels'             => $labels,
        'public'             => true,
        'publicly_queryable' => true,
        'show_ui'            => true,
        'show_in_menu'       => 'edit.php?post_type=partner', // ANINHA no menu de Parceiros!
        'query_var'          => true,
        'rewrite'            => array( 'slug' => 'parceiros/%partner_slug%/evento' ), // URL dinâmica (ajustaremos depois)
        'capability_type'    => 'post',
        'has_archive'        => 'eventos', //true,
        'hierarchical'       => false,
        'menu_position'      => null,
        'menu_icon'          => 'dashicons-calendar-alt',
        'supports'           => array( 'title', 'thumbnail', 'editor' ), // Título, Imagem e Texto
        'show_in_rest'       => true, // Compatível com Gutenberg
    );

    register_post_type( 'event', $args );
}

/* ======================================================================
 * Meta Box de Detalhes do Evento
 * ====================================================================== */

// Registra o box no editor
add_action( 'add_meta_boxes', 'culturando_event_add_meta_box' );
function culturando_event_add_meta_box() {
	add_meta_box(
		'culturando_event_details',
		__( 'Detalhes do Evento', 'culturando' ),
		'culturando_event_meta_box_html',
		'event',
		'normal',
		'high'
	);
}

// Renderiza o HTML do box
function culturando_event_meta_box_html( $post ) {
	// Nonce para segurança
	wp_nonce_field( 'culturando_event_meta_box', 'culturando_event_meta_box_nonce' );

	// Recupera dados salvos
	$data = [
		'date'      => get_post_meta( $post->ID, '_event_date', true ),
		'time'      => get_post_meta( $post->ID, '_event_time', true ),
		'duration'   => get_post_meta( $post->ID, '_event_duration', true ),
		'price'     => get_post_meta( $post->ID, '_event_price', true ),
		'link'      => get_post_meta( $post->ID, '_event_link_ticket', true ),
		'partner_id' => get_post_meta( $post->ID, '_event_partner_id', true )
	];

	// Se for um novo post vindo da tela do parceiro, captura o ID da URL
	if ( empty( $data['partner_id'] ) && isset( $_GET['parceiro_pai'] ) ) {
		$data['partner_id'] = absint( $_GET['parceiro_pai'] );
	}

	$parceiro_nome = $data['partner_id'] ? get_the_title( $data['partner_id'] ) : __( 'Não vinculado', 'culturando' );
	?>
	<div style="display: grid; gap: 1.2rem;">
		<div style="display: grid; grid-template-columns: 1fr 1fr; gap: 1rem;">
			<div>
				<label style="font-weight: 600; display: block; margin-bottom: 4px;">Data do Evento</label>
				<input type="date" name="event_date" value="<?php echo esc_attr( $data['date'] ); ?>" style="width: 100%; padding: 6px;">
			</div>
			<div>
				<label style="font-weight: 600; display: block; margin-bottom: 4px;">Horário</label>
				<input type="time" name="event_time" value="<?php echo esc_attr( $data['time'] ); ?>" style="width: 100%; padding: 6px;">
			</div>
		</div>

		<div style="display: grid; grid-template-columns: 1fr 1fr; gap: 1rem;">
			<div>
				<label style="font-weight: 600; display: block; margin-bottom: 4px;">Duração</label>
				<input type="text" name="event_duration" value="<?php echo esc_attr( $data['duration'] ); ?>" placeholder="Ex: 2h ou 120min" style="width: 100%; padding: 6px;">
			</div>
			<div>
				<label style="font-weight: 600; display: block; margin-bottom: 4px;">Preço do Ingresso</label>
				<input type="text" name="event_price" value="<?php echo esc_attr( $data['price'] ); ?>" placeholder="Gratuito ou R$ 50,00" style="width: 100%; padding: 6px;">
			</div>
		</div>

		<div>
			<label style="font-weight: 600; display: block; margin-bottom: 4px;">🔗 Link para Compra/Inscrição</label>
			<input type="url" name="event_link_ticket" value="<?php echo esc_attr( $data['link'] ); ?>" placeholder="https://..." style="width: 100%; padding: 6px;">
		</div>

		<div style="background: #f6f7f7; padding: 12px; border-left: 4px solid #2271b1; border-radius: 4px;">
			<label style="font-weight: 600; display: block; margin-bottom: 4px;">Parceiro Vinculado</label>
			<span style="font-size: 1.1rem; font-weight: 600; color: #1d2327;"><?php echo esc_html( $parceiro_nome ); ?></span>
			<input type="hidden" name="event_partner_id" value="<?php echo esc_attr( $data['partner_id'] ); ?>">
		</div>
	</div>
	<?php
}

// Salva os dados
add_action( 'save_post_event', 'culturando_event_save_meta' );
function culturando_event_save_meta( $post_id ) {
	// Verificações de segurança padrão
	if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) return;
	if ( ! isset( $_POST['culturando_event_meta_box_nonce'] ) || ! wp_verify_nonce( $_POST['culturando_event_meta_box_nonce'], 'culturando_event_meta_box' ) ) return;
	if ( ! current_user_can( 'edit_post', $post_id ) ) return;

	// Sanitiza e salva cada campo
	if ( isset( $_POST['event_date'] ) ) {
		update_post_meta( $post_id, '_event_date', sanitize_text_field( $_POST['event_date'] ) );
	}
	if ( isset( $_POST['event_time'] ) ) {
		update_post_meta( $post_id, '_event_time', sanitize_text_field( $_POST['event_time'] ) );
	}
	if ( isset( $_POST['event_duration'] ) ) {
		update_post_meta( $post_id, '_event_duration', sanitize_text_field( $_POST['event_duration'] ) );
	}
	if ( isset( $_POST['event_price'] ) ) {
		update_post_meta( $post_id, '_event_price', sanitize_text_field( $_POST['event_price'] ) );
	}
	if ( isset( $_POST['event_link_ticket'] ) ) {
		update_post_meta( $post_id, '_event_link_ticket', esc_url_raw( $_POST['event_link_ticket'] ) );
	}

	// Trava o parceiro: só define se ainda não existir (evita que editem o hidden input)
	if ( empty( get_post_meta( $post_id, '_event_partner_id', true ) ) && isset( $_POST['event_partner_id'] ) ) {
		update_post_meta( $post_id, '_event_partner_id', absint( $_POST['event_partner_id'] ) );
	}
}

/* ======================================================================
 * Meta Box na tela do Parceiro (Lista + Botão Novo Evento)
 * ====================================================================== */

add_action( 'add_meta_boxes', 'culturando_partner_events_meta_box' );
function culturando_partner_events_meta_box() {
	add_meta_box(
		'culturando_partner_events',
		__( 'Eventos nesta casa', 'culturando' ),
		'culturando_partner_events_html',
		'partner',
		'side',
		'default'
	);
}

function culturando_partner_events_html( $post ) {
	$partner_id = $post->ID;

	// Busca eventos vinculados a este parceiro (apenas publicados)
	$events_query = new WP_Query( [
		'post_type'      => 'event',
		'post_status'    => 'publish',
		'posts_per_page' => 5,
		'meta_key'       => '_event_date',
		'orderby'        => 'meta_value',
		'order'          => 'ASC',
		'meta_query'     => [
			[
				'key'     => '_event_partner_id',
				'value'   => $partner_id,
				'compare' => '='
			]
		]
	] );
	?>
	<div style="margin-bottom: 12px;">
		<?php
		// URL para criar novo evento já com o parceiro travado
		$add_url = admin_url( 'post-new.php?post_type=event&parceiro_pai=' . $partner_id );
		?>
		<a href="<?php echo esc_url( $add_url ); ?>" class="button button-primary" style="width: 100%; text-align: center; margin-bottom: 8px;">
			+ Novo Evento
		</a>
	</div>

	<?php if ( $events_query->have_posts() ) : ?>
		<ul style="list-style: none; padding: 0; margin: 0; font-size: 13px;">
			<?php while ( $events_query->have_posts() ) : $events_query->the_post();
				$date_raw = get_post_meta( get_the_ID(), '_event_date', true );
				$date_fmt = $date_raw ? date( 'd/m/Y', strtotime( $date_raw ) ) : '—';
			?>
				<li style="padding: 6px 0; border-bottom: 1px solid #f0f0f1;">
					<a href="<?php echo esc_url( get_edit_post_link() ); ?>" style="text-decoration: none; display: flex; justify-content: space-between; align-items: center;">
						<span style="font-weight: 500; color: #1d2327; max-width: 75%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;">
							<?php the_title(); ?>
						</span>
						<span style="color: #646970; font-size: 12px; white-space: nowrap; margin-left: 6px;">
							<?php echo esc_html( $date_fmt ); ?>
						</span>
					</a>
				</li>
			<?php endwhile; ?>
		</ul>
		<?php wp_reset_postdata(); ?>
		
		<?php if ( $events_query->found_posts > 5 ) : ?>
			<p style="margin: 8px 0 0; font-size: 12px;">
				<a href="<?php echo esc_url( admin_url( 'edit.php?post_type=event&parceiro_filter=' . $partner_id ) ); ?>">
					Ver todos (<?php echo $events_query->found_posts; ?>)
				</a>
			</p>
		<?php endif; ?>

	<?php else : ?>
		<p style="color: #646970; font-style: italic; margin: 8px 0;">
			Nenhum evento cadastrado ainda.
		</p>
	<?php endif; ?>
	<?php
}

/* ======================================================================
 * Função de Query Inteligente (Só eventos futuros)
 * ====================================================================== */

if ( ! function_exists( 'culturando_get_upcoming_events' ) ) {
    /**
     * Busca eventos de um parceiro que ainda não aconteceram.
     * 
     * @param int $partner_id ID do parceiro.
     * @param int $limit      Quantidade de eventos (default 3).
     * @return WP_Query
     */
    function culturando_get_upcoming_events( $partner_id, $limit = 5 ) {
        
        $today = date( 'Y-m-d' ); // Pega a data de hoje no formato 'YYYY-MM-DD'

        $args = [
            'post_type'      => 'event',
            'post_status'    => 'publish',
            'posts_per_page' => $limit,
            'meta_query'     => [
                'relation' => 'AND',
                // 1. Vinculado ao parceiro certo
                [
                    'key'     => '_event_partner_id',
                    'value'   => $partner_id,
                    'compare' => '=',
                    'type'    => 'NUMERIC'
                ],
                // 2. Data do evento é MAIOR ou IGUAL a hoje
                [
                    'key'     => '_event_date',
                    'value'   => $today,
                    'compare' => '>=',
                    'type'    => 'DATE'
                ]
            ],
            // Ordena do mais próximo para o mais distante
            'meta_key'       => '_event_date',
            'orderby'        => 'meta_value',
            'order'          => 'ASC'
        ];

        return new WP_Query( $args );
    }
}

/* ======================================================================
 * Colunas na Listagem de Eventos (Admin)
 * ====================================================================== */

// 1. Define as colunas
add_filter( 'manage_event_posts_columns', 'culturando_events_columns' );
function culturando_events_columns( $columns ) {
    // Remove colunas inúteis
    unset( $columns['tags'] ); 
    
    // Insere novas colunas
    $new_columns = [];
    $new_columns['cb'] = $columns['cb'];
    $new_columns['title'] = $columns['title'];
    $new_columns['event_partner'] = 'Parceiro'; // Nova
    $new_columns['event_date'] = 'Data';         // Nova
    $new_columns['event_time'] = 'Hora';         // Nova
    $new_columns['event_price'] = 'Preço';       // Nova
    $new_columns['date'] = $columns['date'];
    
    return $new_columns;
}

// 2. Preenche as colunas com dados
add_action( 'manage_event_posts_custom_column', 'culturando_fill_events_columns', 10, 2 );
function culturando_fill_events_columns( $column, $post_id ) {
    switch ( $column ) {
        case 'event_partner':
            $pid = get_post_meta( $post_id, '_event_partner_id', true );
            if ( $pid ) {
                $partner = get_post( $pid );
                echo $partner ? '<a href="' . get_edit_post_link( $pid ) . '">' . esc_html( $partner->post_title ) . '</a>' : '—';
            } else {
                echo '<span style="color:#aaa">Órfão</span>';
            }
            break;

        case 'event_date':
            $d = get_post_meta( $post_id, '_event_date', true );
            // Destaca se já passou (vermelho) ou é hoje (azul)
            if ( $d ) {
                $class = ( $d < date('Y-m-d') ) ? 'style="color:#d63638; font-weight:bold;"' : '';
                echo '<span ' . $class . '>' . date( 'd/m/Y', strtotime( $d ) ) . '</span>';
            }
            break;

        case 'event_time':
            $h = get_post_meta( $post_id, '_event_time', true );
            echo $h ? esc_html( $h ) : '—';
            break;

        case 'event_price':
            $p = get_post_meta( $post_id, '_event_price', true );
            echo $p ? '<strong>' . esc_html( $p ) . '</strong>' : '—';
            break;
    }
}

add_action( 'admin_head', 'culturando_hide_event_add_new_button' );
function culturando_hide_event_add_new_button() {
    $screen = get_current_screen();
    if ( $screen && $screen->post_type === 'event' ) {
        echo '<style>.post-type-event .page-title-action { display: none !important; }</style>';
    }
}

/* ======================================================================
 * Rewrite Rules e Permalinks Corretos (partner/%slug%/evento)
 * ====================================================================== */

// 1. Registra a tag de rewrite dinâmica
add_action( 'init', 'culturando_event_rewrite_tag' );
function culturando_event_rewrite_tag() {
    add_rewrite_tag( '%partner_slug%', '([^/]+)' );
}

// 2. Substitui o placeholder pelo slug real do parceiro ao gerar o link
add_filter( 'post_type_link', 'culturando_event_permalink', 10, 2 );
function culturando_event_permalink( $permalink, $post ) {
    // Garante que temos um objeto WP_Post válido
    if ( is_numeric( $post ) ) {
        $post = get_post( $post );
    }
    
    // Se não for o CPT 'event', retorna o link original
    if ( ! $post || $post->post_type !== 'event' ) {
        return $permalink;
    }

    // Pega o ID do parceiro vinculado
    $partner_id = get_post_meta( $post->ID, '_event_partner_id', true );
    
    // Se não tiver parceiro, usa fallback
    if ( ! $partner_id ) {
        return str_replace( '%partner_slug%', 'sem-vinculo', $permalink );
    }

    // Pega o slug do parceiro (post_name)
    $partner_slug = get_post_field( 'post_name', $partner_id );
    
    // Se não achar o slug, usa fallback
    if ( ! $partner_slug ) {
        $partner_slug = 'sem-vinculo';
    }

    // Substitui o placeholder pelo slug real
    return str_replace( '%partner_slug%', $partner_slug, $permalink );
}

/* ======================================================================
 * Template Tag: the_event_data()
 * Exibe os dados do evento em um box formatado
 * ====================================================================== */

/**
 * Exibe (echo) os dados do evento atual em um box.
 * Deve ser usada dentro do Loop do CPT 'event'.
 * 
 * @param array $args Opções de exibição.
 */
function the_event_data( $args = [] ) {
	echo get_event_data( $args );
}

/**
 * Retorna (string) o HTML dos dados do evento atual.
 * 
 * @param array $args {
 *     Opções de exibição.
 *     
 *     @type bool   $show_partner   Exibe o nome do parceiro? Default true.
 *     @type bool   $show_duration  Exibe duração se existir? Default true.
 *     @type bool   $show_price     Exibe preço se existir? Default true.
 *     @type bool   $show_link      Exibe botão de link se existir? Default true.
 *     @type string $before         HTML antes do box.
 *     @type string $after          HTML depois do box.
 * }
 * @return string HTML formatado ou string vazia.
 */
function get_event_data( $args = [] ) {
	$defaults = [
		'show_partner'  => true,
		'show_duration' => true,
		'show_price'    => true,
		'show_link'     => true,
		'before'        => '<div class="event-data-box">',
		'after'         => '</div>',
	];
	$args = wp_parse_args( $args, $defaults );

	$post_id = get_the_ID();
	
	// Garante que estamos no CPT correto
	if ( get_post_type( $post_id ) !== 'event' ) {
		return '';
	}

	// Coleta os dados
	$data = [
		'partner_id'   => get_post_meta( $post_id, '_event_partner_id', true ),
		'date'         => get_post_meta( $post_id, '_event_date', true ),
		'time'         => get_post_meta( $post_id, '_event_time', true ),
		'duration'      => get_post_meta( $post_id, '_event_duration', true ),
		'price'        => get_post_meta( $post_id, '_event_price', true ),
		'link_ticket'  => get_post_meta( $post_id, '_event_link_ticket', true ),
	];

	// Se não tiver data, não exibe nada (evento inválido)
	if ( empty( $data['date'] ) ) {
		return '';
	}

	// Formatações
	$date_fmt = date_i18n( 'd/m/Y', strtotime( $data['date'] ) );
	$time_fmt = $data['time'] ? date_i18n( 'H:i', strtotime( $data['time'] ) ) : '';
	$partner  = $data['partner_id'] ? get_post( $data['partner_id'] ) : null;

	ob_start();
	?>
    <div class="event-data">
	<?php echo $args['before']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
	
	<div class="event-data-grid">
		
		<?php if ( $args['show_partner'] && $partner ) : ?>
			<div class="event-data-item event-data-partner">
				<span class="event-data-label"><?php esc_html_e( 'Local', 'culturando' ); ?></span>
				<a href="<?php echo esc_url( get_permalink( $partner->ID ) ); ?>" class="event-data-value">
					<?php echo esc_html( $partner->post_title ); ?>
				</a>
			</div>
		<?php endif; ?>

		<div class="event-data-item event-data-datetime">
			<span class="event-data-label"><?php esc_html_e( 'Quando', 'culturando' ); ?></span>
			<span class="event-data-value">
				<?php echo esc_html( $date_fmt ); ?>
				<?php if ( $time_fmt ) : ?>
					<span class="event-data-time">às <?php echo esc_html( $time_fmt ); ?></span>
				<?php endif; ?>
			</span>
		</div>

		<?php if ( $args['show_duration'] && ! empty( $data['duration'] ) ) : ?>
			<div class="event-data-item event-data-duration">
				<span class="event-data-label"><?php esc_html_e( 'Duração', 'culturando' ); ?></span>
				<span class="event-data-value"><?php echo esc_html( $data['duration'] ); ?></span>
			</div>
		<?php endif; ?>

		<?php if ( $args['show_price'] && ! empty( $data['price'] ) ) : ?>
			<div class="event-data-item event-data-price">
				<span class="event-data-label"><?php esc_html_e( 'Ingresso', 'culturando' ); ?></span>
				<span class="event-data-value"><?php echo esc_html( $data['price'] ); ?></span>
			</div>
		<?php endif; ?>

	</div>

	<?php if ( $args['show_link'] && ! empty( $data['link_ticket'] ) ) : ?>
		<div class="event-data-actions">
			<a href="<?php echo esc_url( $data['link_ticket'] ); ?>" class="event-data-link" target="_blank" rel="noopener">
				<?php esc_html_e( 'Comprar ingresso', 'culturando' ); ?>
			</a>
		</div>
	<?php endif; ?>

	<?php echo $args['after']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
        
    </div>
	<?php
	return ob_get_clean();
}

/* ======================================================================
 * Template Tag: the_next_events()
 * Lista os próximos eventos de um parceiro
 * ====================================================================== */

function the_next_events( $args = [] ) {
	
	// Configurações padrão
	$defaults = [
		'limit'        => 2,            // Quantos eventos mostrar
		'show_time'    => true,         // Mostrar hora?
		'title'        => __( 'Próximos Eventos', 'culturando' ), // Título da seção
		'before'       => '<div class="partner-upcoming-events">',
		'after'        => '</div>',
		'none'         => __( 'Não há eventos agendados neste momento.', 'culturando' ),
	];
	$args = wp_parse_args( $args, $defaults );

	// Determina o ID do parceiro (usa o ID atual do loop se não especificado)
	$partner_id = isset( $args['partner_id'] ) ? $args['partner_id'] : get_the_ID();
	
	if ( ! $partner_id || get_post_type( $partner_id ) !== 'partner' ) {
		return; // Segurança: não roda se não estivermos num parceiro
	}

	// Reutiliza a query inteligente que criamos antes
	$events = culturando_get_upcoming_events( $partner_id, $args['limit'] );

	// Se não achar nada, mostra a msg de fallback
	if ( ! $events->have_posts() ) {
        if ( ! empty( $args['none'] ) ) {
            echo '<p class="partner-no-events">' . esc_html( $args['none'] ) . '</p>';
        } 
		return;
	}
	?>

	<?php echo $args['before']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
		
		<?php if ( $args['title'] ) : ?>
			<h3 class="partner-events-title"><?php echo esc_html( $args['title'] ); ?></h3>
		<?php endif; ?>

		<ul class="partner-events-list">
			<?php while ( $events->have_posts() ) : $events->the_post(); 
				// Pega os dados direto do post atual do loop
				$date_raw = get_post_meta( get_the_ID(), '_event_data', true );
				$hora_raw = get_post_meta( get_the_ID(), '_event_hora', true );
			?>
				<li class="partner-event-item">
					<a href="<?php the_permalink(); ?>" class="partner-event-link">
						<span class="partner-event-date">
							<span class="date-day"><?php echo esc_html( date_i18n( 'd', strtotime( $date_raw ) ) ); ?></span>
							<span class="date-month"><?php echo esc_html( date_i18n( 'M', strtotime( $date_raw ) ) ); ?></span>
						</span>
						<div class="partner-event-info">
							<span class="partner-event-title"><?php the_title(); ?></span>
							<?php if ( $args['show_time'] && $hora_raw ) : ?>
								<span class="partner-event-time">
									<?php echo esc_html( date_i18n( 'H\hi', strtotime( $hora_raw ) ) ); ?>
								</span>
							<?php endif; ?>
						</div>
					</a>
				</li>
			<?php endwhile; wp_reset_postdata(); ?>
		</ul>

	<?php echo $args['after']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
	<?php
}

add_action( 'pre_get_posts', 'culturando_filter_event_archive' );
function culturando_filter_event_archive( $query ) {
    if ( is_admin() || ! $query->is_main_query() ) return;
    
    if ( is_post_type_archive( 'event' ) ) {
        $query->set( 'meta_key', '_event_data' );
        $query->set( 'orderby', 'meta_value' );
        $query->set( 'order', 'ASC' );
        $query->set( 'meta_query', [
            [
                'key'     => '_event_data',
                'value'   => date( 'Y-m-d' ),
                'compare' => '>=',
                'type'    => 'DATE'
            ]
        ]);
    }
}