<?php
// Đặt cấu hình cho môi trường Moodle.
define('CLI_SCRIPT', true); // Định nghĩa để script chạy trên command line.
require_once(__DIR__ . '/config.php');
require_once($CFG->dirroot . '/course/lib.php');
require_once($CFG->dirroot . '/mod/page/lib.php');

/**
 * Hàm tạo một Page Activity trong Moodle.
 *
 * @param int $courseid ID của khóa học.
 * @param int $topicid ID của topic (section) trong khóa học.
 * @param string $page_name Tên của trang.
 * @param string $page_content Nội dung của trang.
 * @return int|false Trả về ID của page nếu thành công, hoặc `false` nếu thất bại.
 * @throws Exception Nếu xảy ra lỗi.
 */
function create_page_activity($courseid, $topicid, $page_name, $page_content) {
    global $DB;

    try {
        // Lấy thông tin khóa học.
        $course = $DB->get_record('course', ['id' => $courseid], '*', MUST_EXIST);

        // Kiểm tra section tồn tại.
        $section = $DB->get_record('course_sections', ['course' => $courseid, 'section' => $topicid], '*', MUST_EXIST);

        // Dữ liệu của activity page.
        $page_data = (object)[
            'course' => $courseid,
            'name' => $page_name, // Tên của trang (tên tệp đã bóc tách).
            'content' => $page_content, // Nội dung trang.
            'contentformat' => FORMAT_HTML, // Định dạng nội dung.
            'intro' => 'Automatically generated page activity.', // Phần giới thiệu mặc định.
            'introformat' => FORMAT_HTML, // Định dạng phần giới thiệu.
            'timemodified' => time() // Thời gian chỉnh sửa cuối cùng.
        ];

        // Tạo bản ghi trong bảng `page`.
        $pageid = $DB->insert_record('page', $page_data); // **Cập nhật DB: Bảng `page`.**
        if (!$pageid) {
            throw new moodle_exception('Không thể tạo bản ghi trong bảng page.');
        }

        // Tạo bản ghi trong bảng `course_modules` (CM).
        $module = $DB->get_record('modules', ['name' => 'page'], '*', MUST_EXIST); // Lấy module ID cho `page`.
        $module_instance = (object)[
            'course' => $courseid,
            'module' => $module->id,
            'instance' => $pageid, // Liên kết với bản ghi trong `page`.
            'section' => $section->id,
            'added' => time(),
            'visible' => 1, // Hoạt động này có hiển thị không.
            'visibleold' => 1,
            'groupmode' => 0,
            'groupingid' => 0,
            'groupmembersonly' => 0
        ];
        $cmid = $DB->insert_record('course_modules', $module_instance); // **Cập nhật DB: Bảng `course_modules`.**
        if (!$cmid) {
            throw new moodle_exception('Không thể tạo bản ghi trong bảng course_modules.');
        }

        // Cập nhật bảng `course_sections`.
        $section->sequence = trim($section->sequence . ',' . $cmid, ',');
        $DB->update_record('course_sections', $section); // **Cập nhật DB: Bảng `course_sections`.**

        rebuild_course_cache($courseid); // Xây dựng lại bộ nhớ đệm của khóa học.

        // Ghi lại sự kiện trong `logstore_standard_log`.
        $event = \core\event\course_module_created::create([
            'context' => context_course::instance($courseid),
            'objectid' => $cmid,
            'courseid' => $courseid,
            'relateduserid' => null, // Không cần thiết nếu chạy từ CLI.
            'other' => [
                'modulename' => 'page',
                'instanceid' => $pageid, // Thêm instanceid.
                'name' => $page_name // Thêm tên hoạt động.
            ]
        ]);
        $event->trigger(); // **Ghi vào DB: Bảng `logstore_standard_log`.**

        return $pageid;
    } catch (Exception $e) {
        echo "Lỗi: " . $e->getMessage() . "\n";
        return false;
    }
}

/**
 * Hàm phân tích một dòng stream và bóc tách tên tệp.
 *
 * @param string $stream_line Dòng stream cần phân tích.
 * @return array Mảng chứa tên tệp đã bóc tách và dòng stream.
 */
function parse_stream_line($stream_line) {
    // Kiểm tra nếu chuỗi có dấu ngoặc vuông hay không.
    if (strpos($stream_line, '[') === false || strpos($stream_line, ']') === false) {
        return ['', '']; // Trả về giá trị mặc định nếu không có dấu ngoặc vuông.
    }

    // Giả sử tệp có dạng: [stream=tháng năm/tên_video.mp4]
    preg_match('/\[(.*?)\]/', $stream_line, $matches);

    // Kiểm tra nếu tìm thấy tên tệp trong dòng stream.
    if (isset($matches[1])) {
        $file_name_with_extension = $matches[1]; // Lấy tên tệp từ dòng stream.

        // Loại bỏ phần mở rộng tệp (ví dụ .mp4, .avi, .jpg)
        $file_name_without_extension = pathinfo($file_name_with_extension, PATHINFO_FILENAME);

        // Loại bỏ các ký tự không cần thiết ở cuối (các phần sau dấu gạch nối, gạch dưới hoặc ký tự vô nghĩa)
        // Chỉ giữ lại các phần tên hợp lý trước khi xuất hiện các ký tự đặc biệt.
        $file_name_clean = preg_replace('/[^\w\s-]/', '', $file_name_without_extension); // Loại bỏ các ký tự đặc biệt.
        $file_name_clean = preg_replace('/[-\s]+/', ' ', $file_name_clean); // Thay thế các dấu gạch nối và khoảng trắng liên tiếp bằng một dấu cách.
        $file_name_clean = trim($file_name_clean); // Loại bỏ khoảng trắng ở đầu và cuối.

        return [$file_name_clean, $stream_line]; // Trả về tên tệp đã được xử lý và dòng stream.
    }

    // Nếu không tìm thấy tên tệp, trả về giá trị mặc định.
    return ['', '']; 
}

// Chương trình chính
$courseid = 1347;  // ID của khóa học.
$topicid = 0;   // ID của topic (section) trong khóa học.

// Kiểm tra xem có truyền tên tệp từ dòng lệnh không
if ($argc < 2) {
    echo "Vui lòng cung cấp tên tệp chứa các dòng stream.\n";
    exit(1);
}

// Đọc tên tệp từ dòng lệnh
$filename = $argv[1];

// Kiểm tra nếu tệp có tồn tại không
if (!file_exists($filename)) {
    echo "Tệp không tồn tại: {$filename}\n";
    exit(1);
}

// Đọc tệp và xử lý từng dòng
$file_lines = file($filename, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
foreach ($file_lines as $stream_line) {
    // Lấy tên tệp và dòng stream.
    list($page_name, $page_content) = parse_stream_line($stream_line);

    // Tạo Page Activity với nội dung từ dòng stream.
    $pageid = create_page_activity($courseid, $topicid, $page_name, $page_content);
    if ($pageid !== false) {
        echo "Tạo Page Activity thành công! Page ID: {$pageid}\n";
    } else {
        echo "Không thể tạo Page Activity.\n";
    }
}
?>

