<?php
/**
 * [1.5.404] SESSÕES DE GRAVAÇÃO AO VIVO ("Iniciar Gravação").
 *
 * Quando chega a data de gravação, a equipa carrega em INICIAR GRAVAÇÃO
 * (app admin): o artista é notificado ("a tua filmagem já começou") e o
 * participante (feat) com conta 1MZ também. O cronómetro conta o tempo da
 * sessão até o admin carregar em FILMAGEM DO DIA FINALIZADA — aí responde:
 *   - TUDO FILMADO → projeto passa a EDIÇÃO; artista (+feat) notificados.
 *   - CONTINUA     → indica quantos % FALTAM e o PRÓXIMO DIA; artista
 *                    (+feat) notificados ("continua no dia X").
 * Durante a sessão a equipa regista QUEM ESTÁ NA FILMAGEM: foto + nome +
 * papel ("essa pessoa é X, é modelo").
 *
 * Estado em extra_data:
 *   filming_sessions: [ { day, date, started_at, started_ts, ended_at,
 *       duration_min, participants:[{name,role,photo,added_at}],
 *       result:'wrapped'|'continue', percent_left, next_date } ]
 *   filming_progress: { percent_left, updated_at }   (última resposta)
 */

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

/* ====================================================================== */
/* HELPERS                                                                 */
/* ====================================================================== */

/** Lê o projeto + extra. @return array|null [ $row, $extra ] */
function rmbz_fs_load( $project_id ) {
    global $wpdb;
    $p = $wpdb->get_row( $wpdb->prepare(
        "SELECT p.*, w.user_nome FROM {$wpdb->prefix}rmbz_artist_projects p
         LEFT JOIN {$wpdb->prefix}rmbz_wallets w ON w.user_telemovel = p.artist_telemovel
         WHERE p.id=%d", (int) $project_id
    ) );
    if ( ! $p ) return null;
    $extra = ! empty( $p->extra_data ) ? json_decode( $p->extra_data, true ) : [];
    if ( ! is_array( $extra ) ) $extra = [];
    return [ $p, $extra ];
}

function rmbz_fs_save_extra( $project_id, array $extra, array $also = [] ) {
    global $wpdb;
    $data = array_merge( $also, [ 'extra_data' => wp_json_encode( $extra ) ] );
    return false !== $wpdb->update( $wpdb->prefix . 'rmbz_artist_projects', $data, [ 'id' => (int) $project_id ] );
}

/** Índice da sessão ATIVA (sem ended_at) em filming_sessions, ou -1. */
function rmbz_fs_active_index( array $extra ) {
    $sessions = ( ! empty( $extra['filming_sessions'] ) && is_array( $extra['filming_sessions'] ) ) ? $extra['filming_sessions'] : [];
    foreach ( $sessions as $i => $s ) {
        if ( is_array( $s ) && empty( $s['ended_at'] ) ) return (int) $i;
    }
    return -1;
}

/**
 * Notifica também o PARTICIPANTE (feat) com conta 1MZ (push + sino do app),
 * exceto se ele recusou. Usado em todos os marcos da gravação.
 */
function rmbz_fs_notify_feat( array $extra, $title, $body, $severity = 'info' ) {
    if ( empty( $extra['feat']['has_account'] ) || empty( $extra['feat']['tel'] ) ) return;
    if ( ( $extra['feat']['consent']['status'] ?? '' ) === 'declined' ) return;
    if ( function_exists( 'rmbz_notify_user' ) ) {
        rmbz_notify_user( (string) $extra['feat']['tel'], $title, $body, $severity );
    }
}

/* ====================================================================== */
/* INICIAR GRAVAÇÃO                                                        */
/* ====================================================================== */

/** @return array [ 'success'=>bool, 'message'=>string ] */
function rmbz_filming_session_start( $project_id ) {
    $loaded = rmbz_fs_load( $project_id );
    if ( ! $loaded ) return [ 'success' => false, 'message' => 'Projeto não encontrado.' ];
    list( $p, $extra ) = $loaded;

    if ( empty( $extra['filming_start'] ) && empty( $extra['filming_end'] ) ) {
        return [ 'success' => false, 'message' => 'Define primeiro as datas de gravação do projeto.' ];
    }
    if ( ! in_array( (string) $p->production_status, [ 'pre-production', 'filming' ], true ) ) {
        return [ 'success' => false, 'message' => 'O projeto não está numa fase que permita iniciar a gravação.' ];
    }
    if ( rmbz_fs_active_index( $extra ) >= 0 ) {
        return [ 'success' => false, 'message' => 'Já há uma sessão de gravação a decorrer — finaliza o dia primeiro.' ];
    }
    // [1.5.408] Sem a EQUIPA ESSENCIAL completa não se inicia a gravação —
    // mesma regra do diagnóstico "o projecto não pode avançar para filmagens".
    if ( function_exists( 'rmbz_team_validate_project' ) ) {
        $team_diag = rmbz_team_validate_project( $extra );
        if ( empty( $team_diag['ok'] ) ) {
            $faltam = implode( ', ', array_map( fn( $x ) => $x['label'], (array) ( $team_diag['missing'] ?? [] ) ) );
            return [ 'success' => false, 'message' => '⛔ Não podes iniciar a gravação — faltam cargos essenciais na equipa: ' . $faltam . '. Completa a equipa do videoclipe primeiro.' ];
        }
    }

    $sessions = ( ! empty( $extra['filming_sessions'] ) && is_array( $extra['filming_sessions'] ) ) ? $extra['filming_sessions'] : [];
    $day = count( $sessions ) + 1;
    $sessions[] = [
        'day'          => $day,
        'date'         => current_time( 'Y-m-d' ),
        'started_at'   => current_time( 'mysql' ),
        'started_ts'   => (int) current_time( 'timestamp', true ), // UTC p/ cronómetro
        'participants' => [],
    ];
    $extra['filming_sessions'] = $sessions;

    // 1.º dia: o projeto entra oficialmente em FILMAGEM (stepper avança).
    $also = ( (string) $p->production_status === 'pre-production' )
        ? [ 'production_status' => 'filming' ] : [];
    if ( ! rmbz_fs_save_extra( (int) $p->id, $extra, $also ) ) {
        return [ 'success' => false, 'message' => 'Falha ao gravar na base de dados.' ];
    }

    $title = (string) $p->project_title;
    $owner = (string) $p->artist_telemovel;

    // Artista: TODOS os canais.
    if ( function_exists( 'rmbz_notify_user' ) ) {
        rmbz_notify_user( $owner, '🎬 A tua filmagem começou!',
            sprintf( 'A equipa 1MZ iniciou AGORA a gravação do teu videoclipe "%s" (dia %d de filmagem). Boa sorte — vais recebendo novidades por aqui!', $title, $day ),
            'success' );
    }
    if ( function_exists( 'rmbz_notify' ) ) {
        rmbz_notify( $owner, 'filming_live_started', [
            'nome_artista' => (string) ( $p->user_nome ?: 'Artista' ),
            'musica'       => $title,
            'dia'          => (string) $day,
            'site_name'    => get_bloginfo( 'name' ),
        ] );
    }
    // Participante (feat): também é avisado.
    rmbz_fs_notify_feat( $extra, '🎬 A filmagem começou!',
        sprintf( 'A gravação do videoclipe "%s", em que participas, começou agora (dia %d). Fica atento — podes ser chamado!', $title, $day ),
        'success' );

    if ( function_exists( 'rmbz_pchat_append_change_log' ) ) {
        $who = function_exists( 'rmbz_pchat_current_admin_who' ) ? rmbz_pchat_current_admin_who() : 'admin';
        rmbz_pchat_append_change_log( (int) $p->id, [
            'who' => $who, 'what' => sprintf( '🎬 INICIOU a gravação (dia %d)', $day ),
        ] );
    }
    return [ 'success' => true, 'message' => sprintf( 'Gravação iniciada (dia %d) — artista%s notificado. Bom trabalho! 🎬', $day, ! empty( $extra['feat']['tel'] ) ? ' e participante' : '' ) ];
}

/* ====================================================================== */
/* QUEM ESTÁ NA FILMAGEM (foto + nome + papel)                             */
/* ====================================================================== */

/**
 * [1.5.410] CATEGORIAS PREDEFINIDAS de quem participa numa gravação de
 * videoclipe. Usadas no registo de presenças (site + app admin) e na
 * árvore de participantes por categoria.
 */
function rmbz_fs_categories() {
    return [
        'artista'      => [ 'label' => 'Artista principal',    'icon' => '🎤' ],
        'feat'         => [ 'label' => 'Artista Feat',         'icon' => '🎶' ],
        'modelo'       => [ 'label' => 'Modelo',               'icon' => '💃' ],
        'dancarino'    => [ 'label' => 'Dançarino(a)',         'icon' => '🕺' ],
        'figurante'    => [ 'label' => 'Figurante',            'icon' => '👥' ],
        'realizador'   => [ 'label' => 'Realizador / Diretor', 'icon' => '🎬' ],
        'camera'       => [ 'label' => 'Operador de Câmara',   'icon' => '🎥' ],
        'drone'        => [ 'label' => 'Piloto de Drone',      'icon' => '🛸' ],
        'iluminacao'   => [ 'label' => 'Iluminação',           'icon' => '💡' ],
        'som'          => [ 'label' => 'Técnico de Som',       'icon' => '🎙️' ],
        'maquilhagem'  => [ 'label' => 'Maquilhagem / Cabelo', 'icon' => '💄' ],
        'guarda_roupa' => [ 'label' => 'Guarda-Roupa / Styling','icon' => '👗' ],
        'producao'     => [ 'label' => 'Produção / Assistente','icon' => '📋' ],
        'seguranca'    => [ 'label' => 'Segurança',            'icon' => '🛡️' ],
        'motorista'    => [ 'label' => 'Motorista',            'icon' => '🚗' ],
        'outro'        => [ 'label' => 'Outro',                'icon' => '✨' ],
    ];
}

/** Meta de uma categoria (fallback "Outro"). */
function rmbz_fs_category_meta( $key ) {
    $cats = rmbz_fs_categories();
    return $cats[ $key ] ?? $cats['outro'];
}

/**
 * [1.5.410] Substitui a lista de participantes de um DIA (edição total —
 * mesmo depois da gravação terminar). Mantém AUDITORIA na sessão:
 *   participants_edits     = nº de vezes que foi editada
 *   participants_edited_at = data/hora da última edição
 *   participants_edited_by = quem editou
 *
 * @param int   $project_id
 * @param int   $day     Número do dia (1..N).
 * @param array $people  [ [name, category, role, photo], ... ]
 * @return array [ 'success'=>bool, 'message'=>string ]
 */
function rmbz_filming_session_people_set( $project_id, $day, $people ) {
    $loaded = rmbz_fs_load( $project_id );
    if ( ! $loaded ) return [ 'success' => false, 'message' => 'Projeto não encontrado.' ];
    list( $p, $extra ) = $loaded;

    $sessions = ( ! empty( $extra['filming_sessions'] ) && is_array( $extra['filming_sessions'] ) ) ? $extra['filming_sessions'] : [];
    $idx = -1;
    foreach ( $sessions as $i => $s ) {
        if ( is_array( $s ) && (int) ( $s['day'] ?? 0 ) === (int) $day ) { $idx = (int) $i; break; }
    }
    if ( $idx < 0 ) return [ 'success' => false, 'message' => 'Dia de filmagem não encontrado.' ];

    $cats = rmbz_fs_categories();
    $clean = [];
    foreach ( (array) $people as $pp ) {
        if ( ! is_array( $pp ) ) continue;
        $name = sanitize_text_field( (string) ( $pp['name'] ?? '' ) );
        if ( mb_strlen( $name ) < 2 ) continue;
        $cat = sanitize_key( (string) ( $pp['category'] ?? 'outro' ) );
        if ( ! isset( $cats[ $cat ] ) ) $cat = 'outro';
        $clean[] = [
            'name'     => $name,
            'category' => $cat,
            'role'     => sanitize_text_field( (string) ( $pp['role'] ?? '' ) ),
            'photo'    => esc_url_raw( (string) ( $pp['photo'] ?? '' ) ),
            'added_at' => sanitize_text_field( (string) ( $pp['added_at'] ?? current_time( 'mysql' ) ) ),
        ];
    }

    $who = function_exists( 'rmbz_pchat_current_admin_who' ) ? rmbz_pchat_current_admin_who() : 'admin';
    $extra['filming_sessions'][ $idx ]['participants'] = $clean;
    $extra['filming_sessions'][ $idx ]['participants_edits'] = (int) ( $extra['filming_sessions'][ $idx ]['participants_edits'] ?? 0 ) + 1;
    $extra['filming_sessions'][ $idx ]['participants_edited_at'] = current_time( 'mysql' );
    $extra['filming_sessions'][ $idx ]['participants_edited_by'] = $who;
    rmbz_fs_save_extra( (int) $p->id, $extra );

    if ( function_exists( 'rmbz_pchat_append_change_log' ) ) {
        rmbz_pchat_append_change_log( (int) $p->id, [
            'who'  => $who,
            'what' => sprintf( '✏️ Editou os participantes do dia %d de filmagem (%d pessoa(s), %dª edição)',
                (int) $day, count( $clean ), (int) $extra['filming_sessions'][ $idx ]['participants_edits'] ),
        ] );
    }
    return [ 'success' => true, 'message' => sprintf( 'Participantes do dia %d atualizados (%d pessoa(s)).', (int) $day, count( $clean ) ) ];
}

/**
 * [1.5.410] Regista uma presença na sessão a decorrer. A pessoa tem uma
 * CATEGORIA predefinida (Modelo, Artista Feat, …) + detalhe livre opcional.
 * @return array [ 'success'=>bool, 'message'=>string ]
 */
function rmbz_filming_session_add_person( $project_id, $name, $role, $photo_url = '', $category = 'outro' ) {
    $loaded = rmbz_fs_load( $project_id );
    if ( ! $loaded ) return [ 'success' => false, 'message' => 'Projeto não encontrado.' ];
    list( $p, $extra ) = $loaded;

    $idx = rmbz_fs_active_index( $extra );
    if ( $idx < 0 ) return [ 'success' => false, 'message' => 'Não há sessão de gravação a decorrer — inicia a gravação primeiro.' ];

    $name = sanitize_text_field( (string) $name );
    $role = sanitize_text_field( (string) $role );
    $category = sanitize_key( (string) $category );
    $cats = rmbz_fs_categories();
    if ( mb_strlen( $name ) < 2 ) return [ 'success' => false, 'message' => 'Indica o nome da pessoa.' ];
    if ( ! isset( $cats[ $category ] ) ) $category = 'outro';
    // Compat: chamadas antigas sem categoria mas com papel escrito.
    if ( $category === 'outro' && $role === '' ) {
        return [ 'success' => false, 'message' => 'Escolhe a categoria da pessoa (ex.: Modelo, Artista Feat) ou descreve o papel.' ];
    }

    $extra['filming_sessions'][ $idx ]['participants'][] = [
        'name'     => $name,
        'category' => $category,
        'role'     => $role,
        'photo'    => esc_url_raw( (string) $photo_url ),
        'added_at' => current_time( 'mysql' ),
    ];
    rmbz_fs_save_extra( (int) $p->id, $extra );

    $cat_label = $cats[ $category ]['label'];
    if ( function_exists( 'rmbz_pchat_append_change_log' ) ) {
        $who = function_exists( 'rmbz_pchat_current_admin_who' ) ? rmbz_pchat_current_admin_who() : 'admin';
        rmbz_pchat_append_change_log( (int) $p->id, [
            'who' => $who, 'what' => '📸 Registou presença na filmagem',
            'from' => '', 'to' => $name . ' (' . $cat_label . ( $role !== '' ? ' · ' . $role : '' ) . ')',
        ] );
    }
    return [ 'success' => true, 'message' => sprintf( '%s (%s) registado na filmagem de hoje.', $name, $cat_label ) ];
}

/* ====================================================================== */
/* FILMAGEM DO DIA FINALIZADA                                              */
/* ====================================================================== */

/**
 * @param bool   $all_done     true = TUDO filmado (vídeo completo).
 * @param int    $percent_left Quantos % FALTAM (quando continua).
 * @param string $next_date    Próximo dia de filmagem 'Y-m-d' (quando continua).
 * @return array [ 'success'=>bool, 'message'=>string ]
 */
function rmbz_filming_session_finish( $project_id, $all_done, $percent_left = 0, $next_date = '' ) {
    $loaded = rmbz_fs_load( $project_id );
    if ( ! $loaded ) return [ 'success' => false, 'message' => 'Projeto não encontrado.' ];
    list( $p, $extra ) = $loaded;

    $idx = rmbz_fs_active_index( $extra );
    if ( $idx < 0 ) return [ 'success' => false, 'message' => 'Não há sessão de gravação a decorrer.' ];

    $percent_left = max( 0, min( 99, (int) $percent_left ) );
    $next_date    = sanitize_text_field( (string) $next_date );
    if ( ! $all_done ) {
        if ( $next_date === '' || ! preg_match( '/^\d{4}-\d{2}-\d{2}$/', $next_date ) ) {
            return [ 'success' => false, 'message' => 'Indica a data do próximo dia de filmagem.' ];
        }
        if ( $percent_left <= 0 ) {
            return [ 'success' => false, 'message' => 'Indica quantos % ainda faltam filmar (1–99).' ];
        }
    }

    $s = $extra['filming_sessions'][ $idx ];
    $now_ts = (int) current_time( 'timestamp', true );
    $dur_min = max( 1, (int) round( ( $now_ts - (int) ( $s['started_ts'] ?? $now_ts ) ) / 60 ) );

    $s['ended_at']     = current_time( 'mysql' );
    $s['duration_min'] = $dur_min;
    $s['result']       = $all_done ? 'wrapped' : 'continue';
    $s['percent_left'] = $all_done ? 0 : $percent_left;
    if ( ! $all_done ) $s['next_date'] = $next_date;
    $extra['filming_sessions'][ $idx ] = $s;
    $extra['filming_progress'] = [
        'percent_left' => $all_done ? 0 : $percent_left,
        'updated_at'   => current_time( 'mysql' ),
    ];

    $day   = (int) ( $s['day'] ?? ( $idx + 1 ) );
    $title = (string) $p->project_title;
    $owner = (string) $p->artist_telemovel;
    $dur_h = $dur_min >= 60 ? floor( $dur_min / 60 ) . 'h' . str_pad( (string) ( $dur_min % 60 ), 2, '0', STR_PAD_LEFT ) : $dur_min . ' min';

    if ( $all_done ) {
        // TUDO FILMADO → o projeto avança para EDIÇÃO.
        $also = ( (string) $p->production_status === 'filming' ) ? [ 'production_status' => 'editing' ] : [];
        rmbz_fs_save_extra( (int) $p->id, $extra, $also );

        if ( function_exists( 'rmbz_notify_user' ) ) {
            rmbz_notify_user( $owner, '🎉 Filmagem CONCLUÍDA!',
                sprintf( 'A gravação do teu videoclipe "%s" está 100%% concluída (%d dia(s) de filmagem)! O vídeo entra agora em EDIÇÃO — em breve tens novidades.', $title, $day ),
                'success' );
        }
        if ( function_exists( 'rmbz_notify' ) ) {
            rmbz_notify( $owner, 'filming_live_wrapped', [
                'nome_artista' => (string) ( $p->user_nome ?: 'Artista' ),
                'musica'       => $title,
                'dias'         => (string) $day,
                'site_name'    => get_bloginfo( 'name' ),
            ] );
        }
        rmbz_fs_notify_feat( $extra, '🎉 Filmagem concluída!',
            sprintf( 'A gravação do videoclipe "%s", em que participas, está 100%% concluída. Obrigado pela participação — o vídeo entra em edição!', $title ),
            'success' );

        if ( function_exists( 'rmbz_pchat_append_change_log' ) ) {
            $who = function_exists( 'rmbz_pchat_current_admin_who' ) ? rmbz_pchat_current_admin_who() : 'admin';
            rmbz_pchat_append_change_log( (int) $p->id, [
                'who' => $who, 'what' => sprintf( '🏁 Finalizou o dia %d (%s) — TUDO FILMADO; projeto em edição', $day, $dur_h ),
            ] );
        }

        // [1.5.409] A filmagem acabou → a TAXA DE VISTORIA vence agora. Se
        // não estiver paga, o projeto entra BLOQUEADO em edição e o artista
        // é avisado em todos os canais do porquê.
        $vistoria_msg = '';
        if ( function_exists( 'rmbz_team_vistoria_notify_if_blocked' )
             && rmbz_team_vistoria_notify_if_blocked( (int) $p->id ) ) {
            $vistoria_msg = ' ⚠️ ATENÇÃO: a taxa de vistoria está POR PAGAR — o projeto ficou BLOQUEADO (sem edição nem entrega) e o artista foi avisado.';
        }
        return [ 'success' => true, 'message' => sprintf( '🎉 Dia %d finalizado (%s) — vídeo 100%%%% filmado! O projeto passou para EDIÇÃO e o artista foi notificado.', $day, $dur_h ) . $vistoria_msg ];
    }

    // CONTINUA noutro dia.
    rmbz_fs_save_extra( (int) $p->id, $extra );
    $next_br = date_i18n( 'd/m/Y', strtotime( $next_date . ' 12:00:00' ) );

    if ( function_exists( 'rmbz_notify_user' ) ) {
        rmbz_notify_user( $owner, '🎬 Filmagem do dia terminada',
            sprintf( 'O dia %d de gravação do teu videoclipe "%s" terminou (%s de filmagem). Falta %d%% — a filmagem CONTINUA no dia %s.', $day, $title, $dur_h, $percent_left, $next_br ),
            'info' );
    }
    if ( function_exists( 'rmbz_notify' ) ) {
        rmbz_notify( $owner, 'filming_live_continues', [
            'nome_artista' => (string) ( $p->user_nome ?: 'Artista' ),
            'musica'       => $title,
            'dia'          => (string) $day,
            'falta'        => (string) $percent_left,
            'data'         => $next_br,
            'site_name'    => get_bloginfo( 'name' ),
        ] );
    }
    rmbz_fs_notify_feat( $extra, '🎬 Filmagem continua',
        sprintf( 'O dia %d de gravação do videoclipe "%s", em que participas, terminou. Falta %d%% — continua no dia %s. Podes ser chamado!', $day, $title, $percent_left, $next_br ),
        'info' );

    if ( function_exists( 'rmbz_pchat_append_change_log' ) ) {
        $who = function_exists( 'rmbz_pchat_current_admin_who' ) ? rmbz_pchat_current_admin_who() : 'admin';
        rmbz_pchat_append_change_log( (int) $p->id, [
            'who' => $who, 'what' => sprintf( '⏸️ Finalizou o dia %d (%s) — falta %d%%; continua a %s', $day, $dur_h, $percent_left, $next_br ),
        ] );
    }
    return [ 'success' => true, 'message' => sprintf( 'Dia %d finalizado (%s). Falta %d%% — continua no dia %s. Artista notificado.', $day, $dur_h, $percent_left, $next_br ) ];
}

/* ====================================================================== */
/* WP ADMIN (admin-post) — Iniciar / Registar pessoa / Finalizar dia       */
/* ====================================================================== */

/**
 * [1.5.410] Núcleo: guarda uma foto a partir do caminho temporário do upload
 * e devolve o URL público (local ou S3), ou '' se inválida/falhou.
 */
function rmbz_fs_store_photo_tmp( $tmp_name, $project_id ) {
    if ( empty( $tmp_name ) || ! is_uploaded_file( $tmp_name ) ) return '';
    $img = @getimagesize( $tmp_name );
    if ( ! $img || ! in_array( $img[2], [ IMAGETYPE_JPEG, IMAGETYPE_PNG, IMAGETYPE_WEBP ], true ) ) return '';
    $ext  = image_type_to_extension( $img[2], false );
    $name = sprintf( 'filmagem-%d-%s.%s', (int) $project_id, wp_date( 'Ymd-His' ) . '-' . wp_generate_password( 6, false ), $ext );
    $up   = wp_upload_bits( $name, null, (string) file_get_contents( $tmp_name ) );
    if ( ! empty( $up['error'] ) ) return '';
    // [1.5.406] S3 ligado → a foto vai para o bucket.
    if ( function_exists( 'rmbz_s3_maybe_offload' ) && ! empty( $up['file'] ) ) {
        $s3_url = rmbz_s3_maybe_offload( (string) $up['file'] );
        if ( $s3_url !== '' ) return $s3_url;
    }
    return (string) $up['url'];
}

/** Guarda a foto vinda de um <input type="file"> e devolve o URL (ou ''). */
function rmbz_fs_store_uploaded_photo( $file_key, $project_id ) {
    if ( empty( $_FILES[ $file_key ]['tmp_name'] ) ) return '';
    return rmbz_fs_store_photo_tmp( (string) $_FILES[ $file_key ]['tmp_name'], $project_id );
}

add_action( 'admin_post_rmbz_filming_start', function () {
    if ( ! current_user_can( 'manage_options' ) ) wp_die( 'Sem permissão.' );
    $project_id = isset( $_POST['project_id'] ) ? (int) $_POST['project_id'] : 0;
    check_admin_referer( 'rmbz_filming_start_' . $project_id );
    $res = rmbz_filming_session_start( $project_id );
    wp_redirect( add_query_arg( 'msg', rawurlencode( (string) $res['message'] ),
        admin_url( 'admin.php?page=rmbz-projetos&action=edit&id=' . $project_id ) ) );
    exit;
} );

add_action( 'admin_post_rmbz_filming_add_person', function () {
    if ( ! current_user_can( 'manage_options' ) ) wp_die( 'Sem permissão.' );
    $project_id = isset( $_POST['project_id'] ) ? (int) $_POST['project_id'] : 0;
    check_admin_referer( 'rmbz_filming_add_person_' . $project_id );
    $photo_url = rmbz_fs_store_uploaded_photo( 'person_photo', $project_id );
    $res = rmbz_filming_session_add_person(
        $project_id,
        isset( $_POST['person_name'] ) ? wp_unslash( (string) $_POST['person_name'] ) : '',
        isset( $_POST['person_role'] ) ? wp_unslash( (string) $_POST['person_role'] ) : '',
        $photo_url,
        isset( $_POST['person_category'] ) ? (string) $_POST['person_category'] : 'outro'
    );
    wp_redirect( add_query_arg( 'msg', rawurlencode( (string) $res['message'] ),
        admin_url( 'admin.php?page=rmbz-projetos&action=edit&id=' . $project_id ) ) );
    exit;
} );

// [1.5.410] Editar TODOS os participantes de um dia (mesmo depois de
// finalizado) — com auditoria (nº de edições + última vez + por quem).
add_action( 'admin_post_rmbz_filming_edit_people', function () {
    if ( ! current_user_can( 'manage_options' ) ) wp_die( 'Sem permissão.' );
    $project_id = isset( $_POST['project_id'] ) ? (int) $_POST['project_id'] : 0;
    $day        = isset( $_POST['day'] ) ? (int) $_POST['day'] : 0;
    check_admin_referer( 'rmbz_filming_edit_people_' . $project_id . '_' . $day );

    $names  = isset( $_POST['pp_name'] )  && is_array( $_POST['pp_name'] )  ? wp_unslash( $_POST['pp_name'] )  : [];
    $cats   = isset( $_POST['pp_cat'] )   && is_array( $_POST['pp_cat'] )   ? wp_unslash( $_POST['pp_cat'] )   : [];
    $roles  = isset( $_POST['pp_role'] )  && is_array( $_POST['pp_role'] )  ? wp_unslash( $_POST['pp_role'] )  : [];
    $photos = isset( $_POST['pp_photo'] ) && is_array( $_POST['pp_photo'] ) ? wp_unslash( $_POST['pp_photo'] ) : [];
    $people = [];
    foreach ( $names as $i => $nm ) {
        $photo = (string) ( $photos[ $i ] ?? '' );
        // [1.5.410] Foto NOVA carregada nesta linha (input file pp_photo_file[])
        // substitui a antiga.
        if ( ! empty( $_FILES['pp_photo_file']['tmp_name'][ $i ] ) ) {
            $new_photo = rmbz_fs_store_photo_tmp( (string) $_FILES['pp_photo_file']['tmp_name'][ $i ], $project_id );
            if ( $new_photo !== '' ) $photo = $new_photo;
        }
        $people[] = [
            'name'     => (string) $nm,
            'category' => (string) ( $cats[ $i ] ?? 'outro' ),
            'role'     => (string) ( $roles[ $i ] ?? '' ),
            'photo'    => $photo,
        ];
    }
    $res = rmbz_filming_session_people_set( $project_id, $day, $people );
    wp_redirect( add_query_arg( 'msg', rawurlencode( (string) $res['message'] ),
        admin_url( 'admin.php?page=rmbz-projetos&action=edit&id=' . $project_id ) ) );
    exit;
} );

add_action( 'admin_post_rmbz_filming_finish', function () {
    if ( ! current_user_can( 'manage_options' ) ) wp_die( 'Sem permissão.' );
    $project_id = isset( $_POST['project_id'] ) ? (int) $_POST['project_id'] : 0;
    check_admin_referer( 'rmbz_filming_finish_' . $project_id );
    $all_done = isset( $_POST['finish_result'] ) && $_POST['finish_result'] === 'all_done';
    $res = rmbz_filming_session_finish(
        $project_id,
        $all_done,
        isset( $_POST['percent_left'] ) ? (int) $_POST['percent_left'] : 0,
        isset( $_POST['next_date'] ) ? (string) $_POST['next_date'] : ''
    );
    wp_redirect( add_query_arg( 'msg', rawurlencode( (string) $res['message'] ),
        admin_url( 'admin.php?page=rmbz-projetos&action=edit&id=' . $project_id ) ) );
    exit;
} );

/* ====================================================================== */
/* UPLOAD da foto de presença (app admin)                                  */
/* ====================================================================== */

add_action( 'rest_api_init', function () {
    if ( ! defined( 'RMBZ_API_NAMESPACE' ) ) return;
    register_rest_route( RMBZ_API_NAMESPACE, '/admin-app/projects/(?P<id>\d+)/filming-photo', [
        'methods'             => 'POST',
        'callback'            => 'rmbz_fs_upload_photo',
        'permission_callback' => function_exists( 'rmbz_api_require_admin_app_auth' ) ? 'rmbz_api_require_admin_app_auth' : '__return_false',
    ] );
}, 20 );

function rmbz_fs_upload_photo( WP_REST_Request $request ) {
    $project_id = absint( $request['id'] );
    if ( empty( $_FILES['photo']['tmp_name'] ) ) {
        return new WP_Error( 'no_photo', 'Envia a foto no campo "photo".', [ 'status' => 400 ] );
    }
    $img = @getimagesize( $_FILES['photo']['tmp_name'] );
    if ( ! $img || ! in_array( $img[2], [ IMAGETYPE_JPEG, IMAGETYPE_PNG, IMAGETYPE_WEBP ], true ) ) {
        return new WP_Error( 'bad_photo', 'A foto tem de ser JPEG, PNG ou WEBP.', [ 'status' => 415 ] );
    }
    $ext  = image_type_to_extension( $img[2], false );
    $name = sprintf( 'filmagem-%d-%s.%s', $project_id, wp_date( 'Ymd-His' ) . '-' . wp_generate_password( 6, false ), $ext );
    $up   = wp_upload_bits( $name, null, (string) file_get_contents( $_FILES['photo']['tmp_name'] ) );
    if ( ! empty( $up['error'] ) ) {
        return new WP_Error( 'upload_failed', 'Falha no upload: ' . $up['error'], [ 'status' => 500 ] );
    }
    $url = (string) $up['url'];
    // [1.5.406] S3 ligado → a foto vai para o bucket.
    if ( function_exists( 'rmbz_s3_maybe_offload' ) && ! empty( $up['file'] ) ) {
        $s3_url = rmbz_s3_maybe_offload( (string) $up['file'] );
        if ( $s3_url !== '' ) $url = $s3_url;
    }
    // Envelope igual ao resto da API do app admin ({success, data:{...}}).
    return rest_ensure_response( [ 'success' => true, 'data' => [ 'url' => $url ] ] );
}
