<?php
/**
 * Template engine pentru numele produselor.
 * Înlocuiește placeholders {brand}, {model}, {series}, {ean}, {pnk},
 * {cod_oblio}, {pn}, {name} cu valorile produsului.
 *
 * Întoarce stringul rezultat. Dacă un placeholder nu are valoare,
 * se înlocuiește cu string gol (fără spații duble — se face cleanup la final).
 */

/**
 * Lista placeholders suportate pentru hint în UI.
 */
function template_placeholders(): array
{
    return [
        '{brand}'             => 'Brand telefon (ex: Apple)',
        '{model}'             => 'Model telefon (ex: iPhone)',
        '{series}'            => 'Serie principală (ex: 13 Pro)',
        '{compatible}'        => 'Serii compatibile cu virgulă (ex: 13, 14, 15)',
        '{compatible_slash}'  => 'Serii compatibile cu / (ex: 13 / 14 / 15)',
        '{all_series}'        => 'Principal + compatibile cu / (ex: 13 Pro / 13 / 14 / 15)',
        '{name}'              => 'Nume eMAG original',
        '{ean}'               => 'Cod EAN',
        '{pnk}'               => 'Part Number Key (PNK)',
        '{pn}'                => 'Cod produs (Part Number)',
        '{cod_oblio}'         => 'Cod Oblio',
    ];
}

/**
 * Aplică template-ul pe un produs (rând DB cu JOIN-uri standard).
 * Expected fields în $product:
 *   ean, pnk, cod_oblio, emag_part_number, product_name,
 *   phone_brand_name, phone_model_name, phone_series_name
 *
 * @param string $template Șablonul cu placeholders
 * @param array  $product  Rând produs cu fields JOIN-ed
 * @return string Numele generat (trimmed, fără spații duble)
 */
function template_apply(string $template, array $product): string
{
    $primarySeries   = (string)($product['phone_series_name'] ?? '');
    $compatibleRaw   = (string)($product['phone_compatible_names'] ?? '');
    $compatibleSlash = $compatibleRaw !== '' ? str_replace(', ', ' / ', $compatibleRaw) : '';

    // {all_series} = principal + compatibile, cu /
    $allParts = [];
    if ($primarySeries !== '') $allParts[] = $primarySeries;
    if ($compatibleRaw !== '') $allParts[] = $compatibleRaw;
    $allSeriesRaw   = implode(', ', $allParts);
    $allSeriesSlash = $allSeriesRaw !== '' ? str_replace(', ', ' / ', $allSeriesRaw) : '';

    $vars = [
        '{brand}'            => (string)($product['phone_brand_name']  ?? ''),
        '{model}'            => (string)($product['phone_model_name']  ?? ''),
        '{series}'           => $primarySeries,
        '{compatible}'       => $compatibleRaw,
        '{compatible_slash}' => $compatibleSlash,
        '{all_series}'       => $allSeriesSlash,
        '{name}'             => (string)($product['product_name']      ?? ''),
        '{ean}'              => (string)($product['ean']               ?? ''),
        '{pnk}'              => (string)($product['pnk']               ?? ''),
        '{pn}'               => (string)($product['emag_part_number']  ?? ''),
        '{cod_oblio}'        => (string)($product['cod_oblio']         ?? ''),
    ];

    $out = strtr($template, $vars);
    // Cleanup: colapsez spații multiple lăsate de placeholders goi
    $out = preg_replace('/\s+/', ' ', $out);
    return trim($out);
}

/**
 * Limita maximă pentru numele unui produs eMAG (per docs marketplace).
 */
const EMAG_NAME_MAX_LENGTH = 255;

/**
 * Elimină diacriticele (RO + EU comune). Folosit pentru titluri eMAG curate.
 * Map manual pentru determinism — iconv //TRANSLIT poate varia între build-uri PHP.
 */
function strip_diacritics(string $s): string
{
    static $map = [
        // Romanian
        'ă'=>'a','Ă'=>'A', 'â'=>'a','Â'=>'A', 'î'=>'i','Î'=>'I',
        'ș'=>'s','Ș'=>'S', 'ş'=>'s','Ş'=>'S', // comma below + cedilla variants
        'ț'=>'t','Ț'=>'T', 'ţ'=>'t','Ţ'=>'T',
        // European common (în caz că primim titluri internaționale)
        'á'=>'a','é'=>'e','í'=>'i','ó'=>'o','ú'=>'u',
        'à'=>'a','è'=>'e','ì'=>'i','ò'=>'o','ù'=>'u',
        'ä'=>'a','ë'=>'e','ï'=>'i','ö'=>'o','ü'=>'u',
        'Á'=>'A','É'=>'E','Í'=>'I','Ó'=>'O','Ú'=>'U',
        'À'=>'A','È'=>'E','Ì'=>'I','Ò'=>'O','Ù'=>'U',
        'Ä'=>'A','Ë'=>'E','Ï'=>'I','Ö'=>'O','Ü'=>'U',
        'ñ'=>'n','Ñ'=>'N', 'ç'=>'c','Ç'=>'C', 'ß'=>'ss',
    ];
    return strtr($s, $map);
}

/**
 * SQL fragment pentru JOIN-urile necesare pentru template variables.
 * Folosit în queries care vor să returneze produse + numele brand/model/series.
 */
function template_join_sql(): string
{
    return "
        LEFT JOIN phone_series ps ON ps.id = p.phone_series_id
        LEFT JOIN phone_models pm ON pm.id = ps.model_id
        LEFT JOIN phone_brands pb ON pb.id = pm.brand_id
    ";
}

/**
 * SQL fragment pentru SELECT-ul fields-urilor de telefon.
 * Include primary + GROUP_CONCAT pe seriile compatibile.
 */
function template_select_sql(): string
{
    return "
        pb.name AS phone_brand_name,
        pm.name AS phone_model_name,
        ps.name AS phone_series_name,
        (SELECT GROUP_CONCAT(alt_ps.name, ', ')
         FROM product_phone_series_alt a
         JOIN phone_series alt_ps ON alt_ps.id = a.phone_series_id
         WHERE a.product_id = p.id) AS phone_compatible_names
    ";
}
