<?php
/**
 * ============================================================
 *  SCRIPT KẾT NỐI VẠN NĂNG CHO WEBSITE TỰ CODE
 *  WEB3S WEBHOOK CONNECTOR v1.1
 * ============================================================
 *
 * Hướng dẫn sử dụng:
 * 1. Mở file này bằng trình chỉnh sửa mã nguồn
 *    (Notepad++, VS Code, Sublime Text...).
 * 2. Cấu hình Mã bảo mật (Secret Key) và thông tin MySQL ở bên dưới.
 * 3. Upload file này lên thư mục gốc (hoặc bất kỳ thư mục nào)
 *    trên hosting/server của website tự code của bạn.
 * 4. Nhập đường dẫn URL đến file này và Mã bảo mật
 *    vào ứng dụng Web3S Content để kết nối.
 *
 * Ví dụ URL: https://domain-cua-ban.com/web3s-connector.php
 * ============================================================
 */

// Bật output buffering ngay đầu để tránh lỗi "Empty reply from server"
ob_start();

// Tắt hiển thị lỗi ra màn hình (lỗi sẽ được bắt bởi handler bên dưới)
@ini_set('display_errors', '0');
error_reporting(E_ALL);

// Bắt fatal error để trả về JSON thay vì trang trắng
register_shutdown_function(function () {
    $err = error_get_last();
    if ($err && in_array($err['type'], [E_ERROR, E_PARSE, E_CORE_ERROR, E_COMPILE_ERROR])) {
        ob_clean();
        http_response_code(500);
        header('Content-Type: application/json; charset=utf-8');
        echo json_encode([
            'error' => 'Lỗi PHP trong connector: ' . $err['message'] . ' (dòng ' . $err['line'] . ')',
            'hint'  => 'Kiểm tra lại cú pháp file web3s-connector.php hoặc liên hệ hỗ trợ.'
        ], JSON_UNESCAPED_UNICODE);
    }
    ob_end_flush();
});

header('Content-Type: application/json; charset=utf-8');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type, X-Web3s-Secret');

// Xử lý preflight OPTIONS request (CORS)
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
    http_response_code(200);
    exit;
}

// ====================================================================
//  CẤU HÌNH BẮT BUỘC — Chỉnh sửa các thông số dưới đây
// ====================================================================

// Mã bảo mật bí mật — tự đặt, phải trùng với mã nhập trong Web3S Content
define('WEB3S_SECRET_KEY', 'NHAP_MA_BAO_MAT_TU_CHON_O_DAY');

// Thông tin kết nối MySQL
define('DB_HOST', 'localhost');          // Thông thường là localhost
define('DB_USER', 'root');               // Tên đăng nhập database
define('DB_PASS', '');                   // Mật khẩu database
define('DB_NAME', 'ten_database');       // Tên cơ sở dữ liệu của bạn
define('DB_TABLE', 'ten_bang_bai_viet');// Tên bảng chứa bài viết

// Định xạ tên CỘT trong BẢNG (thay đổi nếu tên cột khác)
define('COL_TITLE',   'title');          // Cột lưu Tiêu đề bài viết
define('COL_CONTENT', 'content');        // Cột lưu Nội dung bài viết
define('COL_STATUS',  'status');         // Cột lưu Trạng thái (nháp/công khai)
define('COL_DATE',    'created_at');     // Cột lưu Ngày đăng (để '' nếu không dùng)

// Giá trị Trạng thái trong bảng của bạn
define('VAL_PUBLISH', 'publish');        // Giá trị khi xuất bản ngay
define('VAL_DRAFT',   'draft');          // Giá trị khi lưu nháp

// ====================================================================
//  PHẦN CODE XỬ LÝ — KHÔNG CẦN CHỈNH SỬA BÊN DƯỚI
// ====================================================================

// ---- 1. Đọc dữ liệu đầu vào ----------------------------------------
$rawInput = (string) @file_get_contents('php://input');
$jsonBody = json_decode($rawInput, true);
if (!is_array($jsonBody)) {
    $jsonBody = [];
}

// Merge GET + POST + JSON body (ưu tiên JSON body)
$input = array_merge($_GET, $_POST, $jsonBody);

// ---- 2. Đọc Secret Key từ MỌI nguồn có thể -------------------------
//  - Header: X-Web3s-Secret (tiêu chuẩn)
//  - GET:    ?secret=...     (fallback khi hosting chặn custom headers)
//  - POST:   secret=...      (fallback form-data)
//  - JSON body: {"secret":"..."} (fallback body)

$receivedKey = '';

// Đọc từ header — dùng nhiều cách để tương thích mọi server/hosting
if (function_exists('getallheaders')) {
    foreach (getallheaders() as $hName => $hVal) {
        if (strtolower($hName) === 'x-web3s-secret') {
            $receivedKey = trim($hVal);
            break;
        }
    }
}

// Fallback: đọc từ $_SERVER (luôn hoạt động, kể cả nginx)
if ($receivedKey === '') {
    $receivedKey = trim($_SERVER['HTTP_X_WEB3S_SECRET'] ?? '');
}

// Fallback: đọc từ GET/POST/body
if ($receivedKey === '') {
    $receivedKey = trim($input['secret'] ?? '');
}

// ---- 3. Xác thực Secret Key -----------------------------------------
if ($receivedKey === '' || $receivedKey !== WEB3S_SECRET_KEY) {
    ob_clean();
    http_response_code(401);
    echo json_encode([
        'error' => 'Mã bảo mật (Secret Key) không chính xác hoặc chưa được cấu hình!',
        'hint'  => 'Kiểm tra lại Secret Key trong file web3s-connector.php và trong Web3S Content.'
    ], JSON_UNESCAPED_UNICODE);
    exit;
}

// ---- 4. Lấy dữ liệu bài viết ----------------------------------------
$title   = trim($input['title']   ?? '');
$content = trim($input['content'] ?? '');
$status  = trim($input['status']  ?? 'draft');

// ---- 5. Xử lý Ping / Test connection ---------------------------------
$isTest = isset($input['test_connection']) && $input['test_connection'];
// Cũng coi là test nếu không có title & content
if (!$isTest && $title === '' && $content === '') {
    $isTest = true;
}

if ($isTest) {
    try {
        $dsn = 'mysql:host=' . DB_HOST . ';dbname=' . DB_NAME . ';charset=utf8mb4';
        $pdo = new PDO($dsn, DB_USER, DB_PASS, [
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
            PDO::ATTR_TIMEOUT => 5,
        ]);

        // Kiểm tra bảng có tồn tại không
        $pdo->query('SELECT 1 FROM `' . DB_TABLE . '` LIMIT 1');

        ob_clean();
        echo json_encode([
            'success'  => true,
            'message'  => 'Kết nối cơ sở dữ liệu thành công! Bảng `' . DB_TABLE . '` hoạt động tốt.',
            'db_host'  => DB_HOST,
            'db_name'  => DB_NAME,
            'db_table' => DB_TABLE,
        ], JSON_UNESCAPED_UNICODE);
    } catch (Exception $e) {
        ob_clean();
        http_response_code(500);
        echo json_encode([
            'error' => 'Lỗi kết nối MySQL: ' . $e->getMessage(),
            'hint'  => 'Kiểm tra lại DB_HOST, DB_USER, DB_PASS, DB_NAME và DB_TABLE trong file web3s-connector.php.',
        ], JSON_UNESCAPED_UNICODE);
    }
    exit;
}

// ---- 6. Validate dữ liệu bài viết ------------------------------------
if ($title === '') {
    ob_clean();
    http_response_code(400);
    echo json_encode(['error' => 'Tiêu đề bài viết không được để trống!'], JSON_UNESCAPED_UNICODE);
    exit;
}

if ($content === '') {
    ob_clean();
    http_response_code(400);
    echo json_encode(['error' => 'Nội dung bài viết không được để trống!'], JSON_UNESCAPED_UNICODE);
    exit;
}

// ---- 7. Chèn dữ liệu vào MySQL ---------------------------------------
try {
    $dsn = 'mysql:host=' . DB_HOST . ';dbname=' . DB_NAME . ';charset=utf8mb4';
    $pdo = new PDO($dsn, DB_USER, DB_PASS, [
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    ]);

    $statusVal    = ($status === 'publish') ? VAL_PUBLISH : VAL_DRAFT;
    $cols         = ['`' . COL_TITLE . '`', '`' . COL_CONTENT . '`', '`' . COL_STATUS . '`'];
    $vals         = [$title, $content, $statusVal];
    $placeholders = ['?', '?', '?'];

    if (defined('COL_DATE') && COL_DATE !== '') {
        $cols[]         = '`' . COL_DATE . '`';
        $vals[]         = date('Y-m-d H:i:s');
        $placeholders[] = '?';
    }

    $sql  = 'INSERT INTO `' . DB_TABLE . '` ('
          . implode(', ', $cols)
          . ') VALUES ('
          . implode(', ', $placeholders) . ')';

    $stmt = $pdo->prepare($sql);
    $stmt->execute($vals);
    $insertId = (int) $pdo->lastInsertId();

    ob_clean();
    echo json_encode([
        'success' => true,
        'message' => 'Đăng bài thành công!',
        'id'      => $insertId,
        'title'   => $title,
        'status'  => $statusVal,
    ], JSON_UNESCAPED_UNICODE);

} catch (PDOException $e) {
    ob_clean();
    http_response_code(500);
    echo json_encode([
        'error' => 'Lỗi thực thi SQL: ' . $e->getMessage(),
        'hint'  => 'Kiểm tra lại tên bảng (DB_TABLE) và tên các cột (COL_*) trong file web3s-connector.php.',
    ], JSON_UNESCAPED_UNICODE);
}
