<?php
/**
 * 1MZ For Artists API — Insights Controller (Assistente do Artista)
 *
 * Endpoint:
 *   GET /me/insights?period=30d   — factos + narrativa + cards + sugestões
 *
 * Fase 1: narrativa determinística (template). A costura para a IA já existe
 * no motor (rmbz_insights_ai_enabled) — quando ligada, só a redacção muda;
 * os números continuam a vir da camada determinística.
 *
 * Cache: transient por artista+período (curto). Os dados de stats só mudam
 * quando o admin importa um relatório novo, por isso 30 min é seguro e evita
 * recalcular as agregações a cada abertura do ecrã.
 *
 * @package 1MZ_For_Artists
 * @since 1.5.280
 */

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

if ( ! function_exists( 'rmbz_insights_compute' ) ) {
    require_once dirname( __FILE__, 2 ) . '/ai/insights-engine.php';
}

const RMBZ_INSIGHTS_VERSION    = '1.0.0';
const RMBZ_INSIGHTS_CACHE_TTL  = 1800; // 30 min

add_action( 'rest_api_init', 'rmbz_api_register_insights_routes' );

function rmbz_api_register_insights_routes() {
    register_rest_route( RMBZ_API_NAMESPACE, '/me/insights', [
        'methods'             => 'GET',
        'callback'            => 'rmbz_api_handle_get_insights',
        'permission_callback' => 'rmbz_api_require_auth',
        'args' => [
            // import_id: 0 = relatório mais recente (default), -1 = Tudo (lifetime),
            // >0 = um relatório específico.
            'import_id' => [ 'type' => 'integer', 'default' => 0 ],
            'refresh'   => [ 'type' => 'boolean', 'default' => false ],
        ],
    ] );

    // [1.5.285] Coach diário — saudação + dica do dia (para todos).
    register_rest_route( RMBZ_API_NAMESPACE, '/me/coach', [
        'methods'             => 'GET',
        'callback'            => 'rmbz_api_handle_get_coach',
        'permission_callback' => 'rmbz_api_require_auth',
    ] );

    // [1.6.304] Perfil do Artista para IA — só o OBJETIVO é declarado (1 toque).
    // GET = ler estado; POST = guardar. Para todos (o coach gratuito usa-o).
    register_rest_route( RMBZ_API_NAMESPACE, '/me/ai/profile', [
        [
            'methods'             => 'GET',
            'callback'            => 'rmbz_api_handle_get_ai_profile',
            'permission_callback' => 'rmbz_api_require_auth',
        ],
        [
            'methods'             => 'POST',
            'callback'            => 'rmbz_api_handle_set_ai_profile',
            'permission_callback' => 'rmbz_api_require_auth',
            'args' => [
                'goal' => [ 'type' => 'string', 'required' => true ],
            ],
        ],
    ] );

    // [1.6.313] Memória de conversa persistente do "Perguntar ao assistente".
    register_rest_route( RMBZ_API_NAMESPACE, '/me/ai/memory', [
        'methods'             => 'GET',
        'callback'            => 'rmbz_api_handle_get_ai_memory',
        'permission_callback' => 'rmbz_api_require_auth',
    ] );
    register_rest_route( RMBZ_API_NAMESPACE, '/me/ai/memory/clear', [
        'methods'             => 'POST',
        'callback'            => 'rmbz_api_handle_clear_ai_memory',
        'permission_callback' => 'rmbz_api_require_auth',
    ] );
}

function rmbz_api_handle_get_ai_memory( WP_REST_Request $request ) {
    $telemovel = (string) $request->get_param( 'rmbz_telemovel' );
    if ( ! function_exists( 'rmbz_ai_get_chat_memory' ) ) {
        require_once dirname( __FILE__, 2 ) . '/ai/ai-client.php';
    }
    $mem = rmbz_ai_get_chat_memory( $telemovel );
    $turns = array_map( function ( $m ) {
        return [
            'question' => isset( $m['q'] ) ? (string) $m['q'] : '',
            'answer'   => isset( $m['a'] ) ? (string) $m['a'] : '',
        ];
    }, $mem );
    return rmbz_api_ok( [
        'turns' => array_values( $turns ),
        'limit' => defined( 'RMBZ_AI_MEMORY_MAX' ) ? RMBZ_AI_MEMORY_MAX : 30,
    ] );
}

function rmbz_api_handle_clear_ai_memory( WP_REST_Request $request ) {
    $telemovel = (string) $request->get_param( 'rmbz_telemovel' );
    if ( ! function_exists( 'rmbz_ai_clear_chat_memory' ) ) {
        require_once dirname( __FILE__, 2 ) . '/ai/ai-client.php';
    }
    rmbz_ai_clear_chat_memory( $telemovel );
    return rmbz_api_ok( [ 'cleared' => true ] );
}

/** Opções de objetivo (chave → rótulo curto para a app). */
function rmbz_ai_goal_options() {
    return [
        [ 'key' => 'money',     'label' => 'Ganhar dinheiro' ],
        [ 'key' => 'listeners', 'label' => 'Crescer ouvintes' ],
        [ 'key' => 'viral',     'label' => 'Viralizar nas redes' ],
        [ 'key' => 'video',     'label' => 'Ganhar um videoclipe' ],
        [ 'key' => 'fans',      'label' => 'Construir fãs' ],
    ];
}

function rmbz_api_handle_get_ai_profile( WP_REST_Request $request ) {
    $telemovel = (string) $request->get_param( 'rmbz_telemovel' );
    if ( ! function_exists( 'rmbz_ai_get_goal' ) ) {
        require_once dirname( __FILE__, 2 ) . '/ai/ai-client.php';
    }
    $goal = rmbz_ai_get_goal( $telemovel );
    return rmbz_api_ok( [
        'goal'     => $goal,
        'goal_set' => $goal !== '',
        'options'  => rmbz_ai_goal_options(),
    ] );
}

function rmbz_api_handle_set_ai_profile( WP_REST_Request $request ) {
    $telemovel = (string) $request->get_param( 'rmbz_telemovel' );
    $goal      = sanitize_key( (string) $request->get_param( 'goal' ) );
    if ( ! function_exists( 'rmbz_ai_set_goal' ) ) {
        require_once dirname( __FILE__, 2 ) . '/ai/ai-client.php';
    }
    if ( ! rmbz_ai_set_goal( $telemovel, $goal ) ) {
        return rmbz_api_error( 'Objetivo inválido.', 400, 'bad_goal' );
    }
    return rmbz_api_ok( [ 'goal' => $goal, 'goal_set' => true ] );
}

function rmbz_api_handle_get_coach( WP_REST_Request $request ) {
    $telemovel = (string) $request->get_param( 'rmbz_telemovel' );

    // [1.6.353] Uma mensagem por PERÍODO do dia (manhã/tarde/noite) — muda 3x/dia
    // e nunca repete. Chave inclui a data local + o período.
    $day = current_time( 'Y-m-d' );
    $seg = function_exists( 'rmbz_coach_segment' ) ? rmbz_coach_segment() : '';
    $cache_key = 'rmbz_coach_v3_' . md5( $telemovel ) . '_' . $day . '_' . $seg;

    $cached = get_transient( $cache_key );
    if ( is_array( $cached ) ) {
        // [1.5.295] Saudação SEMPRE fresca — a hora do dia muda ao longo do
        // dia, mas a mensagem/dica ficam em cache (parte cara da IA).
        $cached['greeting'] = rmbz_coach_greeting_for( $telemovel );
        return rmbz_api_ok( $cached );
    }

    $built = rmbz_coach_build( $telemovel );
    $payload = [
        'greeting'     => $built['greeting'],
        'message'      => $built['message'],
        'tip'          => $built['tip'],
        'ai_enabled'   => rmbz_insights_ai_enabled(),
        'generated_at' => mysql_to_rfc3339( current_time( 'mysql', 1 ) ),
    ];

    set_transient( $cache_key, $payload, DAY_IN_SECONDS );

    // Saudação fresca também na primeira geração (consistência).
    $payload['greeting'] = rmbz_coach_greeting_for( $telemovel );
    return rmbz_api_ok( $payload );
}

function rmbz_api_handle_get_insights( WP_REST_Request $request ) {
    $telemovel = (string) $request->get_param( 'rmbz_telemovel' );
    $import_id = (int)    $request->get_param( 'import_id' );
    $refresh   = (bool)   $request->get_param( 'refresh' );

    $cache_key = 'rmbz_insights_v2_' . md5( $telemovel ) . '_imp' . $import_id;

    if ( ! $refresh ) {
        $cached = get_transient( $cache_key );
        if ( is_array( $cached ) ) {
            $cached['cached'] = true;
            return rmbz_api_ok( $cached );
        }
    }

    // Relatórios (imports) do artista com dados — base do seletor.
    $imports = rmbz_insights_imports( $telemovel, 12 );

    // Lista para o app (sem campos internos), com a opção "Tudo" no fim.
    $app_imports = [];
    foreach ( $imports as $imp ) {
        $app_imports[] = [
            'id'       => (int) $imp['id'],
            'label'    => (string) $imp['label'],
            'subtitle' => (string) $imp['subtitle'],
        ];
    }
    if ( count( $imports ) > 1 ) {
        $app_imports[] = [ 'id' => -1, 'label' => 'Tudo', 'subtitle' => 'Todos os relatórios' ];
    }

    // ── Determinar âmbito e calcular factos ──────────────────────────────
    $scope = null;

    if ( empty( $imports ) ) {
        // Sem relatórios → assistente vazio (a app esconde a entrada na Home).
        $facts = rmbz_insights_compute( $telemovel, '30d' );
        $facts['has_data'] = false;
        $scope = [ 'type' => 'none', 'import_id' => 0, 'label' => '', 'subtitle' => '' ];
    } elseif ( $import_id === -1 ) {
        // Tudo / lifetime.
        $facts = rmbz_insights_compute( $telemovel, 'all' );
        $scope = [ 'type' => 'all', 'import_id' => -1, 'label' => 'Tudo', 'subtitle' => 'Todos os relatórios' ];
    } else {
        // Relatório específico (ou o mais recente, se import_id=0/inválido).
        $sel_index = 0;
        if ( $import_id > 0 ) {
            foreach ( $imports as $i => $imp ) {
                if ( (int) $imp['id'] === $import_id ) { $sel_index = $i; break; }
            }
        }
        $sel  = $imports[ $sel_index ];
        $prev = isset( $imports[ $sel_index + 1 ] ) ? $imports[ $sel_index + 1 ] : null;
        $facts = rmbz_insights_compute_by_import( $telemovel, $sel, $prev );
        $scope = [
            'type'      => 'import',
            'import_id' => (int) $sel['id'],
            'label'     => (string) $sel['label'],
            'subtitle'  => (string) $sel['subtitle'],
        ];
    }

    $built = rmbz_insights_build( $facts );

    $payload = [
        '_api_version' => RMBZ_INSIGHTS_VERSION,
        'generated_at' => mysql_to_rfc3339( current_time( 'mysql', 1 ) ),
        'ai_enabled'   => rmbz_insights_ai_enabled(),
        'has_data'     => (bool) $facts['has_data'],
        'scope'        => $scope,
        'imports'      => $app_imports,
        'headline'     => $built['headline'],
        'summary'      => $built['summary'],
        'cards'        => $built['cards'],
        'suggestions'  => $built['suggestions'],
        'cached'       => false,
    ];

    set_transient( $cache_key, $payload, RMBZ_INSIGHTS_CACHE_TTL );

    return rmbz_api_ok( $payload );
}
