yazrkisvs3vvvsv33svrhetrjsvyvsvvyjsvsvs
tavsuysvssvvjvvyjyjkvsvqd
qfogsvvsvsegjdgdfgdskhgdksvqsvshdqsd
<?php
header('Content-Type: application/json');
require_once dirname(__DIR__) . '/auth.php';
dm_require_login();
dm_csrf_verify();

$config_file = dirname(__DIR__) . '/config.php';
if (file_exists($config_file)) require_once $config_file;

$api_key = defined('CLAUDE_API_KEY') ? CLAUDE_API_KEY : '';
if (empty($api_key)) {
    echo json_encode(['ok' => false, 'error' => 'Configura la Claude API Key en ⚙ APIs.']);
    exit;
}

if (!$pdo) { echo json_encode(['ok'=>false,'error'=>'Sin BD']); exit; }

$user = dm_user();
if ($user['role'] !== 'admin') {
    echo json_encode(['ok' => false, 'error' => 'Sin permiso']); exit;
}

$action    = trim($_POST['action'] ?? '');
$client_id = (int)($_POST['client_id'] ?? 0);
if (!$client_id) { echo json_encode(['ok'=>false,'error'=>'Cliente inválido']); exit; }

function call_claude_brand($api_key, $system, $messages, $max_tokens = 500) {
    $payload = [
        'model'      => 'claude-sonnet-4-6',
        'max_tokens' => $max_tokens,
        'system'     => $system,
        'messages'   => $messages,
    ];
    $ch = curl_init('https://api.anthropic.com/v1/messages');
    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true,
        CURLOPT_POSTFIELDS     => json_encode($payload),
        CURLOPT_HTTPHEADER     => ['Content-Type: application/json', 'x-api-key: '.$api_key, 'anthropic-version: 2023-06-01'],
        CURLOPT_TIMEOUT        => 60,
    ]);
    $result    = curl_exec($ch);
    $curl_err  = curl_errno($ch);
    $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);
    if ($curl_err || $http_code !== 200) return ['ok'=>false,'error'=>'API error '.$http_code];
    $data = json_decode($result, true);
    return ['ok'=>true,'text'=>$data['content'][0]['text'] ?? ''];
}

// ——— EXTRAER COLORES DEL LOGO ———
if ($action === 'colors_from_logo') {
    $row = $pdo->prepare('SELECT brand_logo FROM dm_clients WHERE id=? LIMIT 1');
    $row->execute([$client_id]);
    $d = $row->fetch();
    if (!$d || empty($d['brand_logo'])) {
        echo json_encode(['ok'=>false,'error'=>'No hay logo subido para este cliente']); exit;
    }
    $abs = dirname(__DIR__) . '/' . preg_replace('/\?.*$/', '', $d['brand_logo']);
    if (!file_exists($abs) || filesize($abs) === 0) {
        echo json_encode(['ok'=>false,'error'=>'Archivo de logo no encontrado en el servidor']); exit;
    }
    $ext = strtolower(pathinfo($abs, PATHINFO_EXTENSION));
    if ($ext === 'svg') {
        echo json_encode(['ok'=>false,'error'=>'SVG no soportado por Vision. Sube el logo en PNG o JPG.']); exit;
    }
    $mime_map = ['jpg'=>'image/jpeg','jpeg'=>'image/jpeg','png'=>'image/png','webp'=>'image/webp'];
    $mime = $mime_map[$ext] ?? 'image/jpeg';
    $b64  = base64_encode(file_get_contents($abs));

    $messages = [[
        'role' => 'user',
        'content' => [
            ['type'=>'image','source'=>['type'=>'base64','media_type'=>$mime,'data'=>$b64]],
            ['type'=>'text','text'=>"Analiza este logo y extrae los colores principales de la marca.\n\nResponde ÚNICAMENTE con los códigos HEX separados por coma. Sin texto adicional, sin explicaciones, sin puntos.\nEjemplo de respuesta correcta: #E8293B, #1A1A2E, #FFFFFF\n\nReglas:\n- Solo colores del diseño del logo (no fondo blanco genérico ni transparencia)\n- Máximo 6 colores\n- Prioriza el color principal, secundario y terciario"]
        ]
    ]];

    $resp = call_claude_brand($api_key, 'Eres un experto en identidad visual. Extraes paletas HEX exactas de logos con precisión milimétrica.', $messages);
    if (!$resp['ok']) { echo json_encode($resp); exit; }

    preg_match_all('/#[0-9A-Fa-f]{6}/', $resp['text'], $matches);
    $colors = implode(', ', array_unique($matches[0]));
    if (empty($colors)) {
        echo json_encode(['ok'=>false,'error'=>'No se detectaron colores HEX en el logo. Prueba con PNG o JPG de mayor resolución.']); exit;
    }
    echo json_encode(['ok'=>true,'colors'=>$colors]);
    exit;
}

// ——— EXTRAER COLORES Y FUENTES DEL MANUAL DE MARCA (PDF) ———
if ($action === 'extract_from_manual') {
    $row = $pdo->prepare('SELECT brand_manual FROM dm_clients WHERE id=? LIMIT 1');
    $row->execute([$client_id]);
    $d = $row->fetch();
    if (!$d || empty($d['brand_manual'])) {
        echo json_encode(['ok'=>false,'error'=>'No hay manual de marca subido para este cliente']); exit;
    }
    $abs = dirname(__DIR__) . '/' . preg_replace('/\?.*$/', '', $d['brand_manual']);
    if (!file_exists($abs) || filesize($abs) === 0) {
        echo json_encode(['ok'=>false,'error'=>'Archivo del manual no encontrado en el servidor']); exit;
    }
    if (filesize($abs) > 20 * 1024 * 1024) {
        echo json_encode(['ok'=>false,'error'=>'Manual muy grande para analizar (máx 20MB)']); exit;
    }
    $b64 = base64_encode(file_get_contents($abs));

    $messages = [[
        'role' => 'user',
        'content' => [
            ['type'=>'document','source'=>['type'=>'base64','media_type'=>'application/pdf','data'=>$b64]],
            ['type'=>'text','text'=>"Analiza este manual de marca y extrae TODA la información de identidad visual y comunicación.\n\nResponde SOLO en este JSON exacto (sin texto antes ni después):\n{\n  \"colors\": \"#HEX1, #HEX2, #HEX3\",\n  \"fonts\": \"Fuente para títulos · Fuente para cuerpo\",\n  \"elements\": \"Elementos gráficos disponibles y reglas de aplicación: patterns, texturas, iconos, formas, líneas, versiones de logo\",\n  \"photography\": \"Estilo fotográfico: tipo de imágenes, mood, iluminación, composición, qué evitar\",\n  \"tone\": \"Tono de voz y comunicación: formal/informal, adjetivos que usa la marca, palabras que evita\",\n  \"values\": \"Valores y personalidad de la marca: arquetipos, atributos, posicionamiento\",\n  \"audience\": \"Público objetivo: edad, perfil, intereses, necesidades\",\n  \"description\": \"Resumen ejecutivo de la identidad de marca en 3-4 oraciones que capture su esencia completa\"\n}\n\nReglas:\n- HEX exactos si los hay en el manual, si no inferir de los elementos visuales\n- Fuentes: nombres reales que aparezcan en el documento\n- Ser específico y accionable en cada campo — esta información será usada por IA para generar contenido coherente con la marca"]
        ]
    ]];

    $resp = call_claude_brand($api_key, 'Eres un experto en branding e identidad visual. Extraes información precisa y accionable de manuales de marca para uso en generación de contenido con IA.', $messages, 1200);
    if (!$resp['ok']) { echo json_encode($resp); exit; }

    preg_match('/\{[\s\S]*\}/', $resp['text'], $jm);
    if (empty($jm[0])) { echo json_encode(['ok'=>false,'error'=>'No se pudo parsear la respuesta. Intenta de nuevo.']); exit; }
    $extracted = json_decode($jm[0], true);
    if (!$extracted) { echo json_encode(['ok'=>false,'error'=>'Respuesta inválida del API.']); exit; }

    // Construir brand_description formateado para inyectar en prompts de AVI
    $parts = [];
    if (!empty($extracted['values']))      $parts[] = "Valores y personalidad: " . $extracted['values'];
    if (!empty($extracted['tone']))        $parts[] = "Tono de voz: " . $extracted['tone'];
    if (!empty($extracted['audience']))    $parts[] = "Público objetivo: " . $extracted['audience'];
    if (!empty($extracted['elements']))    $parts[] = "Elementos gráficos: " . $extracted['elements'];
    if (!empty($extracted['photography'])) $parts[] = "Fotografía: " . $extracted['photography'];
    if (!empty($extracted['description'])) $parts[] = $extracted['description'];
    $extracted['brand_description'] = implode("\n", $parts);

    echo json_encode(array_merge(['ok'=>true], $extracted));
    exit;
}

echo json_encode(['ok'=>false,'error'=>'Acción inválida']);
