<?php
// api.php - WhatsApp webhook handler (cleaned)
header('Content-Type: application/json');
ini_set('display_errors', 0);
date_default_timezone_set('UTC');

// ───────────────────────────── Helpers: IO / Logs ─────────────────────────────
function ensure_dir($dir)
{
	if (!is_dir($dir)) {
		mkdir($dir, 0777, true);
	}
}

function log_request(array $data)
{
	$logsDir = __DIR__ . DIRECTORY_SEPARATOR . 'logs';
	ensure_dir($logsDir);
	$logFile = $logsDir . DIRECTORY_SEPARATOR . date('Y-m-d') . '.log';
	file_put_contents($logFile, json_encode($data, JSON_UNESCAPED_SLASHES) . PHP_EOL, FILE_APPEND);
}

// ───────────────────── Chat history persistence (per user) ────────────────────
function load_chat_history(string $user_id): array
{
	$dir = __DIR__ . '/chat_history';
	if (!is_dir($dir)) {
		mkdir($dir, 0755, true);
	}
	$filepath = "$dir/chat_{$user_id}.json";

	if (!file_exists($filepath)) {
		return [];
	}

	$json = file_get_contents($filepath);
	$data = json_decode($json, true);
	$data = array_slice($data, 0, 1) + array_slice($data, -12, 12);
	return is_array($data) ? $data : [];
}

function save_chat_history(string $user_id, array $messages): bool
{
	$dir = __DIR__ . '/chat_history';
	if (!is_dir($dir)) {
		mkdir($dir, 0755, true);
	}
	$filepath = "$dir/chat_{$user_id}.json";
	$json = json_encode($messages, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
	return file_put_contents($filepath, $json) !== false;
}

// ─────────────────────────── External AI call (JSON) ──────────────────────────
function GitHub_API($API_KEY, $type, $temp, $model, $messages)
{
	$apiUrl = 'https://models.inference.ai.azure.com/chat/completions';

	$data = json_encode([
		"messages" => $messages,
		"temperature" => $temp,
		"top_p" => 1,
		"max_tokens" => 8000,
		"model" => $model
	]);

	$ch = curl_init();
	curl_setopt($ch, CURLOPT_URL, $apiUrl);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
	curl_setopt($ch, CURLOPT_HTTPHEADER, [
		'Content-Type: application/json',
		'Authorization: Bearer ' . $API_KEY
	]);
	curl_setopt($ch, CURLOPT_POST, true);
	curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

	$response = curl_exec($ch);

	if (curl_errno($ch)) {
		$error = 'cURL error: ' . curl_error($ch);
		curl_close($ch);
		return ['error' => $error];
	}

	curl_close($ch);

	if ($type === 'array') {
		return json_decode($response, true);
	} elseif ($type === 'json') {
		return $response;
	}

	return '';
}

// ───────────────────────────── Chat with history ──────────────────────────────
function chat_with_history(
	string $API_KEY,
	float $temp,
	string $model,
	string $user_id,
	string $user_content,
	string $system_content = ""
): array {
	$history = load_chat_history($user_id);
	$timestampNow = (new DateTime('now', new DateTimeZone('Asia/Damascus')))->format('h:i A');

	if (!empty($system_content)) {
		// FORCE UPDATE: Always ensure the first message is the CURRENT system prompt
		if (isset($history[0]) && $history[0]['role'] === 'system') {
			$history[0]['content'] = $system_content;
		} else {
			array_unshift($history, [
				'role' => 'system',
				'content' => $system_content,
				'timestamp' => $timestampNow
			]);
		}
	}

	// Inject context into the user message for the AI (but keep original in history)
	$contextHeader = "";
	if (strpos($system_content, 'اسم المتحدث معك هو:') !== false) {
		// Extract name from system content for immediate context
		preg_match('/اسم المتحدث معك هو: (.*?)\./', $system_content, $matches);
		if (isset($matches[1])) {
			$contextHeader = "[System Note: User Name is " . $matches[1] . "]\n\n";
		}
	}

	$history[] = [
		'role' => 'user',
		'content' => $user_content,
		'timestamp' => $timestampNow
	];

	$messagesForApi = array_map(function ($m) use ($contextHeader) {
		$content = $m['content'];
		// Prepend context only to the LAST user message
		if ($m['role'] === 'user' && !empty($contextHeader)) {
			// We only want to inject it to the very last message to avoid cluttering context window
			// But array_map doesn't know "last". Let's handled it differently or just prepend to all?
			// Better: Prepend to the user message being processed NOW (which is the last one added to history)
		}
		return ['role' => $m['role'], 'content' => $content];
	}, $history);

	// Context Injection Strategy: Modify the last item in $messagesForApi directly
	if (!empty($contextHeader)) {
		$lastIdx = count($messagesForApi) - 1;
		if ($messagesForApi[$lastIdx]['role'] === 'user') {
			$messagesForApi[$lastIdx]['content'] = $contextHeader . $messagesForApi[$lastIdx]['content'];
		}
	}

	$apiResult = GitHub_API($API_KEY, 'array', $temp, $model, $messagesForApi);
	if (!is_array($apiResult) || !isset($apiResult['choices'][0]['message']['content'])) {
		return [
			'success' => false,
			'assistant' => null,
			'error' => 'بعتذر ماوصلت آخر رسالة بعتتها, ممكن ترجع تبعتها مرة ثانية'
		];
	}

	$assistantContent = trim($apiResult['choices'][0]['message']['content']);
	$history[] = [
		'role' => 'assistant',
		'content' => $assistantContent,
		'timestamp' => $timestampNow
	];

	$saved = save_chat_history($user_id, $history);
	if (!$saved) {
		return ['success' => false, 'assistant' => null, 'error' => 'Failed to save chat history.'];
	}

	return [
		'success' => true,
		'assistant' => ['content' => $assistantContent, 'timestamp' => $timestampNow],
		'error' => null
	];
}

// ───────────────────── Baileys message text extraction ────────────────────────
function extract_text_from_baileys($msg)
{
	if (is_string($msg)) {
		return trim($msg);
	}
	if (!is_array($msg)) {
		return '';
	}

	// Common Baileys text shapes
	if (isset($msg['conversation']) && is_string($msg['conversation'])) {
		return trim($msg['conversation']);
	}
	if (isset($msg['extendedTextMessage']['text']) && is_string($msg['extendedTextMessage']['text'])) {
		return trim($msg['extendedTextMessage']['text']);
	}
	if (isset($msg['buttonsResponseMessage']['selectedButtonId']) && is_string($msg['buttonsResponseMessage']['selectedButtonId'])) {
		return trim($msg['buttonsResponseMessage']['selectedButtonId']);
	}
	if (isset($msg['listResponseMessage']['singleSelectReply']['selectedRowId']) && is_string($msg['listResponseMessage']['singleSelectReply']['selectedRowId'])) {
		return trim($msg['listResponseMessage']['singleSelectReply']['selectedRowId']);
	}

	// If it's a quoted text inside extended message
	if (isset($msg['extendedTextMessage']['contextInfo']['quotedMessage'])) {
		$q = $msg['extendedTextMessage']['contextInfo']['quotedMessage'];
		if (is_array($q)) {
			$qt = extract_text_from_baileys($q);
			if ($qt !== '') {
				return $qt;
			}
		}
	}

	return '';
}

function is_media_message($msg)
{
	if (!is_array($msg)) {
		return false;
	}
	return isset($msg['imageMessage'])
		|| isset($msg['videoMessage'])
		|| isset($msg['audioMessage'])
		|| isset($msg['documentMessage'])
		|| isset($msg['stickerMessage']);
}

// ─────────────────────────────── Entry handling ───────────────────────────────
$sid = isset($_GET['sid']) ? $_GET['sid'] : '';
$rawBody = file_get_contents('php://input');
$body = json_decode($rawBody, true);
if (!is_array($body)) {
	$body = [];
}

// Log every inbound
log_request([
	'time' => date('c'),
	'session_id' => $sid,
	'body' => $body,
	'query' => $_GET,
	'headers' => function_exists('getallheaders') ? getallheaders() : [],
]);

$from = isset($body['from']) ? $body['from'] : '';
$messageId = isset($body['message_id']) ? $body['message_id'] : '';
$messageObj = isset($body['message']) ? $body['message'] : null;

// Decide how to respond
$senderNumber = isset($body['sender_number']) ? $body['sender_number'] : null;
// Fallback if not sent from JS
if (!$senderNumber) {
	$userId = preg_replace('/[^0-9]/', '', $from);
} else {
	$userId = $senderNumber;
}

$senderJid = isset($body['sender_jid']) ? $body['sender_jid'] : $from;
$profilePic = isset($body['profile_picture_url']) ? $body['profile_picture_url'] : null;
$text = extract_text_from_baileys($messageObj);

// If it's media or no text, reply with a fixed message
if ($text === '' || is_media_message($messageObj)) {
	$replyText = "Can't read that. Please send text.";
	echo json_encode([
		'session_id' => $sid,
		'receiver' => $from,
		'message' => $replyText,
	]);
	exit;
}

// Otherwise, send ONLY the text to external API and return its response
// Multiple API keys with fallback on error/invalid response
$API_KEYS = [
	'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',
	'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',
	'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',
	// Add more keys below in order of preference
];
$model = 'gpt-4.1-mini';
$temperature = 0.9;
$default_system = "
انت مندوب مبيعات بشركة Exclusive Identity – إكسكلوسف آيدينتيتي لتكون واجهة المبيعات الرسمية للشركة.
في حال حدا سألك أنت ذكاء اصطناعي أو شو المودل الخاص فيك أو كيف مدرب بتجاوب حصرا ً أنك ذكاء اصطناعي تحت إسم EID-AgentAI-Arabic-260b ومدرب خصوصي من قبل شركتنا لتكون مندوب مبيعات لأي شركة أو مجال بعد ما ندربك للشركة المطلوبة.
أسلوبك:
بتحكي باللهجة الشامية (إلا إذا الزبون طلب لغة تانية).
أسلوبك مهذب، قريب للقلب، وبتتعامل مع الزبون كأنك عم تحكي مع صديق محترم.
بتجاوب بسرعة ووضوح، وبتضل ورا الزبون لحتى تبيعو خدمة.

القواعد:
لازم تسأل الزبون أول شي عن اسمو في حال ماكان موجود معك أو مابتعرفو، وبعد كم رسالة أو بمجال مختلف بتسألو عن مجال عملو أو شغلو.
بعد فترة من الحديث، لازم تسألو عن الإيميل ورقم الهاتف في حال ماكان موجود معك أو مابتعرفو (وإذا ما جاوبك، بتسألو مرة تانية بعد شوي).
بتسوّق فقط خدمات الشركة المذكورة بالملف التعريفي.
ممنوع تحكي أسعار أو رينجات مالية. إذا الزبون سأل عن السعر، بتشجعو يتواصل مع الفريق المختص.
ممنوع تكتب أكواد برمجية أبداً. إذا الزبون طلب كود، بتجاوبو بلطافة: ما بقدر ساعدك بهالموضوع.
لازم تضل تحاول تبيع خدمة، حتى لو الزبون مو مهتم، بس بأسلوب محترم.
مسموح تخترع عروض وأوفَرات جذابة (من غير أسعار).
إذا الزبون طلب تفاصيل تقنية، بتعطيه فكرة عامة مبسطة من غير تعقيد.
إذا الزبون سأل عنك أو عن المودل, الجواب حصراً: أنا ذكاء اصطناعي تحت اسم EID-AgentAI-Arabic-260b ومدرَّب خصوصي من شركتنا لتكون مندوب مبيعات لأي شركة أو مجال.
لازم تراعي فورمات الواتس أب: تستعمل غامق (Bold) , إذا في تعداد، لازم يكون مرقّم (1، 2، 3...).
إذا الزبون رد برقم، بتجاوبو بتفصيل عن الرقم اللي اختارو.
لما تجمع معلومات كافية، بتسألو: بتحب اعملك ملخص MoM عن المحادثة؟ وبتكتب ملخص كامل فيه كل التفاصيل المهمة.

📌 خدمات شركة إكسكلوسف آيدينتيتي:
استضافة المواقع: من استضافة صغيرة لحد VPS وDedicated مع إيميلات احترافية وأمان عالي.
تصميم وتطوير المواقع: مواقع سريعة، متجاوبة، جاهزة للسيو – من المتاجر للأنظمة الكبيرة.
تطبيقات الموبايل: iOS وAndroid (Flutter/Ionic) – تجارة، حجوزات، أو أفكار خاصة.
برمجيات ويب خاصة: CRMs، ERPs، أنظمة محاسبة وموارد بشرية – حسب طلبك.
التسويق الرقمي: إعلانات، سوشال ميديا، حملات مؤثرة، وتسويق فيديو.
بناء الهوية البصرية: اسم، شعار، وهوية متكاملة – رقمية ومطبوعة.
تحسين محركات البحث (SEO) والتحويل (CRO): ترتيب أول بالبحث + تحويل الزوار لعملاء.
أمان المواقع والتطبيقات: SSL، فحص ثغرات، حماية ضد الهجمات.
تصميم واجهات وتجربة استخدام + جرافيك: واجهات جذابة وتجربة استخدام مميزة.
كتابة المحتوى: نصوص مواقع، مدونات، بروفايلات، وسوشال ميديا.
خدمات سحابية واستشارات تقنية: نسخ احتياطي، خطط تقنية، حلول كلاود.

ليش تختارنا؟
خدمات متكاملة من الألف للياء.
فريق بخبرة طويلة بكل المجالات التقنية.
حلول مخصصة حسب أهدافك.
جاهزين للنمو معك بالمستقبل.
أمان وحماية بأعلى المستويات.

معلومات التواصل:
الإيميل: info@exclusive-identity.com
الهاتف: +963934005922
الموقع: www.exclusive-identity.com
";

// Validate PushName
$pushName = isset($body['pushName']) ? $body['pushName'] : 'صديقي';
$ignoredNames = ['WhatsApp', 'WhatsApp User', 'Android', 'iPhone', 'User', 'Guest', 'temp', 'null', 'undefined'];
// Relaxed check: Accept any name that isn't in ignored list and isn't empty. 
// Trusting WhatsApp's pushName more as per user request.
if (empty($pushName) || in_array($pushName, $ignoredNames)) {
	$displayNameString = "";
} else {
	$displayNameString = "اسم المتحدث معك هو: " . $pushName . ".";
}

// Extract real phone number
// We used sender_number from JS to set $userId, so we can just use that.
$phoneNumberString = "رقم هاتف المتحدث هو: " . $userId . ".";

$system_content_with_name = trim($displayNameString . "\n" . $phoneNumberString . "\n" . $default_system);

$result = null;
$lastError = null;
foreach ($API_KEYS as $API_KEY) {
	$try = chat_with_history(
		$API_KEY,
		$temperature,
		$model,
		$userId,
		$text,
		$system_content_with_name
	);
	if (isset($try['success']) && $try['success'] === true) {
		$result = $try;
		break;
	}
	$lastError = $try['error'] ?? 'Unknown error';
}

if (!$result || !$result['success']) {
	echo json_encode([
		'session_id' => $sid,
		'receiver' => $from,
		'message' => ($lastError ?: "بعتذر ماوصلت آخر رسالة بعتتها, ممكن ترجع تبعتها مرة ثانية"),
	]);
	exit;
}

$reply = $result['assistant']['content'];
echo json_encode([
	'session_id' => $sid,
	'receiver' => $from,
	'message' => $reply,
]);
exit;