yazrkisvs3vvvsv33svrhetrjsvyvsvvyjsvsvs
tavsuysvssvvjvvyjyjkvsvqd
qfogsvvsvsegjdgdfgdskhgdksvqsvshdqsd
<?php
// api/competitive_analysis.php — Analiza competidores y genera propuesta basada en ellos
header('Content-Type: application/json');
require_once __DIR__ . '/../config.php';
require_once __DIR__ . '/../db.php';
require_once __DIR__ . '/../auth.php';
dm_require_login();
dm_check_module_access('competitive');

$input  = json_decode(file_get_contents('php://input'), true) ?? [];
$action = $_GET['action'] ?? $input['action'] ?? 'analyze';

// CSRF solo en acciones de escritura
if (in_array($action, ['analyze', 'find', 'save_competitors'])) dm_csrf_verify();

function call_claude_comp(string $prompt): string {
    $api_key = defined('CLAUDE_API_KEY') ? CLAUDE_API_KEY : '';
    if (!$api_key) return '';
    $ch = curl_init('https://api.anthropic.com/v1/messages');
    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_POST           => true,
        CURLOPT_HTTPHEADER     => ['Content-Type: application/json','x-api-key: '.$api_key,'anthropic-version: 2023-06-01'],
        CURLOPT_POSTFIELDS     => json_encode(['model'=>'claude-sonnet-4-6','max_tokens'=>4000,'messages'=>[['role'=>'user','content'=>$prompt]]]),
        CURLOPT_TIMEOUT        => 60,
        CURLOPT_SSL_VERIFYPEER => true, CURLOPT_SSL_VERIFYHOST => 2,
    ]);
    $raw   = curl_exec($ch);
    $errno = curl_errno($ch);
    curl_close($ch);
    if ($errno || $raw === false) return '';
    $r = json_decode($raw, true);
    if (!is_array($r)) return '';
    if (!empty($r['error'])) {
        if (strpos($r['error']['message'] ?? '', 'credit balance') !== false) {
            return '__CREDIT_ERROR__';
        }
    }
    return $r['content'][0]['text'] ?? '';
}

function screenshotone_comp(string $url): string {
    if (!defined('SCREENSHOTONE_ACCESS') || !defined('SCREENSHOTONE_SECRET')) return '';
    $params = ['access_key'=>SCREENSHOTONE_ACCESS,'url'=>$url,'viewport_width'=>'1440','viewport_height'=>'900','format'=>'jpg','image_quality'=>'75','full_page'=>'false','delay'=>'2','cache'=>'true','cache_ttl'=>'604800','block_ads'=>'true','block_cookie_banners'=>'true'];
    ksort($params);
    $query = http_build_query($params);
    $sig   = hash_hmac('sha256', $query, SCREENSHOTONE_SECRET);
    return 'https://api.screenshotone.com/take?' . $query . '&signature=' . $sig;
}

switch ($action) {

    // Encontrar competidores automáticamente
    case 'find':
        $client_id   = (int)($input['client_id'] ?? 0);
        $project     = trim($input['project'] ?? '');
        $industry    = trim($input['industry'] ?? '');
        $description = trim($input['description'] ?? '');

        $prompt = "Eres un estratega de marketing digital experto en investigacion de mercado. Para el siguiente negocio, identifica exactamente 5 competidores directos reales con sitio web activo y verificable.

Negocio: " . $project . "
Industria: " . $industry . "
Descripcion: " . $description . "

CRITERIOS DE SELECCION:
- Deben ser competidores DIRECTOS (mismo servicio, mismo mercado geografico si se puede inferir)
- Sus sitios web deben existir realmente (no inventes URLs)
- Prioriza los mas reconocidos y con mejor presencia digital
- Incluye al menos 1-2 lideres del mercado y 2-3 competidores del mismo nivel

Responde SOLO en JSON con este formato exacto (sin markdown, sin texto adicional):
{\"competitors\":[{\"name\":\"Nombre empresa\",\"url\":\"https://url.com\",\"reason\":\"Por que compite directamente y que hace bien en digital\"},{\"name\":\"...\",\"url\":\"https://...\",\"reason\":\"...\"}]}";

        $result = call_claude_comp($prompt);

        if ($result === '__CREDIT_ERROR__') {
            echo json_encode(['ok'=>false,'error'=>'SIN_CREDITOS']); exit;
        }

        $result = preg_replace('/^```json\s*/i', '', trim($result));
        $result = preg_replace('/```\s*$/', '', $result);
        $data   = json_decode($result, true);

        if (!$data || empty($data['competitors'])) {
            echo json_encode(['ok'=>false,'error'=>'No se pudieron identificar competidores']); exit;
        }

        echo json_encode(['ok'=>true,'competitors'=>$data['competitors']]);
        break;

    // Analizar sitios de competidores con screenshots
    case 'analyze':
        $client_id   = (int)($input['client_id'] ?? 0);
        if ($client_id) dm_require_client_access($client_id);
        $proposal_id = (int)($input['proposal_id'] ?? 0);
        $competitors     = $input['competitors']    ?? []; // array de {name, url}
        $project         = trim($input['project']      ?? '');
        $industry        = trim($input['industry']     ?? '');
        $diferencial     = trim($input['diferencial']  ?? '');
        $valor           = trim($input['valor']        ?? '');
        $publico         = trim($input['publico']      ?? '');
        $ubicacion       = trim($input['ubicacion']    ?? '');
        $analysis_types  = trim($input['analysis_types'] ?? '');

        if (empty($competitors)) { echo json_encode(['ok'=>false,'error'=>'No hay competidores para analizar']); exit; }

        // Tomar screenshots de competidores
        $screenshots = [];
        foreach (array_slice($competitors, 0, 4) as $comp) {
            $url = $comp['url'] ?? '';
            if (!$url || !filter_var($url, FILTER_VALIDATE_URL)) continue;
            $ss = screenshotone_comp($url);
            if ($ss) $screenshots[$comp['name'] . ' (' . $url . ')'] = $ss;
        }

        // Construir prompt de análisis
        $comp_list = implode("\n", array_map(fn($c) => "- {$c['name']}: {$c['url']}", $competitors));

        $ctx_extra = '';
        if ($diferencial) $ctx_extra .= "\nDiferencial clave: {$diferencial}";
        if ($valor)       $ctx_extra .= "\nPropuesta de valor: {$valor}";
        if ($publico)     $ctx_extra .= "\nPúblico objetivo: {$publico}";
        if ($ubicacion)   $ctx_extra .= "\nUbicación/mercado: {$ubicacion}";
        if ($industry)    $ctx_extra .= "\nIndustria: {$industry}";

        $types_block = '';
        if ($analysis_types) {
            $types_block = "\n\nTIPOS DE ANÁLISIS SOLICITADOS: {$analysis_types}\nAsegúrate de cubrir específicamente estos tipos de análisis en tu informe.\n";
        }

        $prompt = "Eres el mejor estratega de diseño web y marketing digital del mundo. Tu analisis va a alimentar directamente el diseno del sitio web de " . $project . " para que SUPERE a su competencia.

CONTEXTO DEL NEGOCIO:{$ctx_extra}
{$types_block}
COMPETIDORES IDENTIFICADOS:
" . $comp_list . "

Genera un INFORME ESTRATEGICO ACCIONABLE con estas secciones:

## 1. ANALISIS POR COMPETIDOR
Para cada uno: fortalezas de diseño y UX, debilidades explotables, su propuesta de valor comunicada, CTA principal.

## 2. PATRONES DE LA COMPETENCIA
¿Qué hace TODOS igual? (colores dominantes, estructura de homepage, tipo de hero, CTAs comunes). Esto es lo que debemos EVITAR para diferenciarnos.

## 3. GAPS Y OPORTUNIDADES
¿Qué NO hace nadie bien? ¿Qué sección o mensaje está ausente en todos? ¿Qué hace mal la mayoría en UX?

## 4. ESTRATEGIA DE DIFERENCIACION PARA " . strtoupper($project) . "
- Posicionamiento visual recomendado (oscuro/claro, minimalista/expresivo, etc.)
- Paleta de colores sugerida para destacar (describe qué evitar y qué usar)
- Propuesta de valor única que nadie más está comunicando
- CTA principal recomendado y por qué

## 5. ESTRUCTURA DE HOMEPAGE GANADORA
Secciones en orden, con titulo sugerido para cada una y por qué ese orden vence a la competencia.

## 6. ELEMENTOS CLAVE A INCLUIR
Lista concreta de 5-7 elementos de diseño o contenido que elevarán este sitio por encima de todos los competidores analizados.

Sé MUY especifico, accionable y orientado a resultados. Este analisis va directo al diseñador.";

        $analysis = call_claude_comp($prompt);

        if ($analysis === '__CREDIT_ERROR__') {
            echo json_encode(['ok'=>false,'error'=>'SIN_CREDITOS']); exit;
        }

        // Guardar en BD
        if ($client_id) {
            try {
                $pdo->prepare("INSERT INTO dm_competitive_analysis (client_id, proposal_id, competitors, analysis) VALUES (?,?,?,?)")
                    ->execute([$client_id, $proposal_id ?: null, json_encode($competitors), $analysis]);
            } catch (Exception $e) {}
        }

        echo json_encode(['ok'=>true,'analysis'=>$analysis,'screenshots'=>$screenshots]);
        break;

    // Obtener historial de análisis
    case 'history':
        $client_id = (int)($_GET['client_id'] ?? 0);
        dm_require_client_access($client_id);
        try {
            // Agrega columna source si no existe
            try { $pdo->exec("ALTER TABLE dm_competitive_analysis ADD COLUMN IF NOT EXISTS source VARCHAR(20) DEFAULT 'manual'"); } catch (\Throwable $e) {}
            $stmt = $pdo->prepare("SELECT id,competitors,analysis,created_at,COALESCE(source,'manual') AS source FROM dm_competitive_analysis WHERE client_id=? ORDER BY created_at DESC LIMIT 10");
            $stmt->execute([$client_id]);
            $rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
            echo json_encode(['ok'=>true,'analyses'=>$rows]);
        } catch (\Throwable $e) {
            echo json_encode(['ok'=>true,'analyses'=>[]]);
        }
        break;

    // Guardar lista de competidores para monitoreo continuo
    case 'save_competitors':
        $client_id = (int)($input['client_id'] ?? 0);
        if (!$client_id) { echo json_encode(['ok'=>false,'error'=>'client_id requerido']); exit; }
        dm_require_client_access($client_id);
        $competitors = $input['competitors'] ?? [];
        $context = [
            'diferencial' => trim($input['diferencial'] ?? ''),
            'valor'       => trim($input['valor']       ?? ''),
            'publico'     => trim($input['publico']     ?? ''),
            'ubicacion'   => trim($input['ubicacion']   ?? ''),
            'url'         => trim($input['url']         ?? ''),
        ];
        $auto = (int)($input['auto_monitor'] ?? 1);
        try {
            $pdo->exec("CREATE TABLE IF NOT EXISTS dm_client_competitors (
                id INT AUTO_INCREMENT PRIMARY KEY,
                client_id INT NOT NULL,
                competitors JSON NOT NULL,
                business_context JSON,
                auto_monitor TINYINT UNSIGNED DEFAULT 1,
                updated_at DATETIME NOT NULL DEFAULT NOW() ON UPDATE NOW(),
                UNIQUE KEY uk_client (client_id)
            ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4");
            $pdo->prepare("INSERT INTO dm_client_competitors (client_id, competitors, business_context, auto_monitor)
                VALUES (?,?,?,?)
                ON DUPLICATE KEY UPDATE
                    competitors=VALUES(competitors),
                    business_context=VALUES(business_context),
                    auto_monitor=VALUES(auto_monitor),
                    updated_at=NOW()")
                ->execute([$client_id, json_encode($competitors), json_encode($context), $auto]);
            echo json_encode(['ok'=>true]);
        } catch (\Throwable $e) {
            echo json_encode(['ok'=>false,'error'=>$e->getMessage()]);
        }
        break;

    // Obtener lista guardada de competidores
    case 'get_competitors':
        $client_id = (int)($_GET['client_id'] ?? $input['client_id'] ?? 0);
        if (!$client_id) { echo json_encode(['ok'=>false,'error'=>'client_id requerido']); exit; }
        dm_require_client_access($client_id);
        try {
            $row = $pdo->prepare("SELECT competitors, business_context, auto_monitor, updated_at FROM dm_client_competitors WHERE client_id=? LIMIT 1");
            $row->execute([$client_id]);
            $r = $row->fetch(PDO::FETCH_ASSOC);
            if (!$r) { echo json_encode(['ok'=>true,'saved'=>false]); exit; }
            echo json_encode([
                'ok'           => true,
                'saved'        => true,
                'competitors'  => json_decode($r['competitors'], true),
                'context'      => json_decode($r['business_context'], true),
                'auto_monitor' => (bool)$r['auto_monitor'],
                'updated_at'   => $r['updated_at'],
            ]);
        } catch (\Throwable $e) {
            echo json_encode(['ok'=>true,'saved'=>false]);
        }
        break;
}