<?php
declare(strict_types=1);
ini_set('display_errors', 'On');
error_reporting(E_ALL);

$dbHost = 'localhost';
$dbUser = 'root';
$dbPass = 'cachicamo';
$dbName = 'mms';

$sendEndpoint = 'https://sms.tsgglobal.world/messages';
$bearerToken  = 'j4hD6t0jMA9UndTsrZ4MBuDK0dqf-vbh';

function normalize_keyword(string $s): string {
    $s = trim($s);
    $s = mb_strtolower($s, 'UTF-8');
    // Transliterate accents/width forms to ASCII when possible
    $t = @iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $s);
    if ($t !== false) {
        $s = $t;
    }
    // Keep only a-z0-9
    return preg_replace('/[^a-z0-9]+/', '', $s) ?? '';
}

function send_sms(string $from, string $to, string $body, string $endpoint, string $bearer): array {
    $payload = json_encode([
        'from' => $from,
        'to'   => [$to],
        'body' => $body,
    ], JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);

    $ch = curl_init($endpoint);
    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_POST           => true,
        CURLOPT_POSTFIELDS     => $payload,
        CURLOPT_HTTPHEADER     => [
            "Authorization: Bearer {$bearer}",
            "Content-Type: application/json",
        ],
        CURLOPT_TIMEOUT        => 30,
        CURLOPT_CONNECTTIMEOUT => 10,
        CURLOPT_USERAGENT      => 'creacomm-sms/1.0',
        CURLOPT_SSL_VERIFYPEER => true,
        CURLOPT_SSL_VERIFYHOST => 2,
    ]);
    $resp = curl_exec($ch);
    $errn = curl_errno($ch);
    $errm = $errn ? curl_error($ch) : '';
    $code = (int)curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);
    return [$code, $resp ?: '', $errn, $errm];
}

$raw = file_get_contents('php://input');
$obj = json_decode($raw);

  $fp = fopen("/tmp/smsdlr.txt", "ab");  
  if ($fp) {                  
    fwrite($fp, "JSON OBJ:[".print_r($obj, true)."]\n");
    fwrite($fp, "JSON RAW:[".print_r($raw, true)."]\n");
    fwrite($fp, "------\n");
    fclose($fp);
  }

if (!$obj || !isset($obj->from, $obj->to, $obj->body, $obj->id, $obj->inserted_at)) {
  $fp = fopen("/tmp/smsdlr.txt", "ab");                
  if ($fp) {                  
    fwrite($fp, "JSON ST:[".print_r($obj, true)."]\n");
    fwrite($fp, "------\n");
    fclose($fp);
  }
  http_response_code(200);
  echo "Bad payload.";
  exit;
}

$rec_date = substr($obj->inserted_at, 0, 10) . ' ' . substr($obj->inserted_at, 11, 8);
$message_norm = normalize_keyword((string)$obj->body);

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli($dbHost, $dbUser, $dbPass, $dbName);
$mysqli->set_charset('utf8mb4');

// Find keyword match (by normalized form)
$kwStmt = $mysqli->prepare("
    SELECT r.keyword_code, r.response_text, r.auto_reply, r.is_optout
    FROM sms_keywords k
    JOIN sms_responses r ON r.keyword_code = k.keyword_code
    WHERE k.variant_norm = ?
    LIMIT 1
");
$kwStmt->bind_param('s', $message_norm);
$kwStmt->execute();
$kwRes = $kwStmt->get_result();
$keyword_code = null; $auto_reply = 0; $response_text = null; $is_optout = 0;
if ($row = $kwRes->fetch_assoc()) {
    $keyword_code = $row['keyword_code'];
    $response_text = $row['response_text'];
    $auto_reply = (int)$row['auto_reply'];
    $is_optout = (int)$row['is_optout'];
}
$kwStmt->close();

// Auto-reply if configured
$sent = 0; $curl_err = '';
if ($keyword_code !== null && $auto_reply === 1) {
    [$code, $resp, $errn, $errm] = send_sms(
        (string)$obj->to,
        (string)$obj->from,
        (string)$response_text,
        $sendEndpoint,
        $bearerToken
    );
    if ($errn === 0 && $code >= 200 && $code < 300) {
        $sent = 1;
    } else {
        $curl_err = $errm ?: "HTTP {$code}: " . substr($resp, 0, 120);
    }
}

// Track opt-outs (by pair)
if ($keyword_code === 'OPTOUT' && $is_optout === 1) {
    $optStmt = $mysqli->prepare("INSERT IGNORE INTO sms_optouts (from_num, to_num, created_at) VALUES (?, ?, NOW())");
    $optStmt->bind_param('ss', $obj->from, $obj->to);
    $optStmt->execute();
    $optStmt->close();
}

// Conversation handling (one open convo per pair)
$convId = null;
$csel = $mysqli->prepare("SELECT id FROM sms_conversations WHERE from_num=? AND to_num=? AND status='open' LIMIT 1");
$csel->bind_param('ss', $obj->from, $obj->to);
$csel->execute();
$cres = $csel->get_result();
if ($conv = $cres->fetch_assoc()) {
    $convId = (int)$conv['id'];
} else {
    $cins = $mysqli->prepare("INSERT INTO sms_conversations (from_num, to_num, status, last_customer_msg_at, unread_customer_count) VALUES (?, ?, 'open', NOW(), 1)");
    $cins->bind_param('ss', $obj->from, $obj->to);
    $cins->execute();
    $convId = (int)$cins->insert_id;
    $cins->close();
}
// Record inbound message into conversation
$msgIns = $mysqli->prepare("INSERT INTO sms_conversation_msgs (conversation_id, direction, body, provider_msg_id, created_at) VALUES (?, 'IN', ?, ?, ?)");
$msgIns->bind_param('isss', $convId, $obj->body, $obj->id, $rec_date);
$msgIns->execute();
$msgIns->close();

// Update conversation unread counter & last_customer_msg_at
$cupd = $mysqli->prepare("UPDATE sms_conversations SET last_customer_msg_at=GREATEST(COALESCE(last_customer_msg_at,'1970-01-01'), ?), unread_customer_count=unread_customer_count+1 WHERE id=?");
$cupd->bind_param('si', $rec_date, $convId);
$cupd->execute();
$cupd->close();

// Insert into original table with new flags
$ins = $mysqli->prepare("
    INSERT INTO smsrec (from_num, to_num, message, message_norm, msg_id, insert_date, replied, keyword_code, has_conversation, pending_from_customer)
    VALUES (?, ?, ?, ?, ?, ?, ?, ?, 1, 1)
");
$ins->bind_param('ssssssis', $obj->from, $obj->to, $obj->body, $message_norm, $obj->id, $rec_date, $sent, $keyword_code);
$ins->execute();
$ins->close();

$mysqli->close();

/* Append to log file */
$fp = fopen("/tmp/smsdlr.txt", "ab");
if ($fp) {
    fwrite($fp, "JSON OBJ:[".print_r($obj, true)."]\n");
    fwrite($fp, "JSON RAW:[".print_r($raw, true)."]\n");
    fwrite($fp, "SENDER :[{$obj->from}]\n");
    fwrite($fp, "SENT TO:[{$obj->to}]\n");
    fwrite($fp, "MESSAGE:[{$obj->body}]\n");
    fwrite($fp, "ID     :[{$obj->id}]\n");
    fwrite($fp, "DATE   :[{$rec_date}]\n");
    if ($curl_err !== '') fwrite($fp, "CURLERR:[{$curl_err}]\n");
    fwrite($fp, "------\n");
    fclose($fp);
}

echo "Received.";
