<?php
/**
 * DatabaseExporter - Export database theo chunk
 *
 * Dump từng bảng với CREATE TABLE + INSERT INTO theo batch.
 * Không load toàn bộ dữ liệu vào RAM.
 */

if (!defined('ABSPATH')) {
    exit;
}

class Foxblock_Backup_DatabaseExporter
{
    const CHUNK_SIZE = 500; // rows per request

    /**
     * Lấy danh sách tất cả bảng trong database
     */
    public static function get_all_tables()
    {
        global $wpdb;
        $tables = $wpdb->get_col('SHOW TABLES');
        return is_array($tables) ? $tables : [];
    }

    /**
     * Xuất CREATE TABLE statement cho 1 bảng
     */
    public static function get_create_table($table)
    {
        global $wpdb;
        $table = esc_sql($table);
        $row   = $wpdb->get_row("SHOW CREATE TABLE `{$table}`", ARRAY_N);
        if (!$row || !isset($row[1])) return '';

        $sql = "-- Table: {$table}\n";
        $sql .= "DROP TABLE IF EXISTS `{$table}`;\n";
        $sql .= $row[1] . ";\n\n";
        return $sql;
    }

    /**
     * Xuất dữ liệu INSERT của 1 bảng theo offset/limit (1 chunk)
     * Trả về SQL string và số dòng đã xuất
     */
    public static function export_table_chunk($table, $offset)
    {
        global $wpdb;
        $table     = esc_sql($table);
        $chunk     = self::CHUNK_SIZE;
        $rows      = $wpdb->get_results(
            "SELECT * FROM `{$table}` ORDER BY 1 LIMIT {$offset}, {$chunk}",
            ARRAY_A
        );

        if (empty($rows)) {
            return ['sql' => '', 'count' => 0, 'done' => true];
        }

        $sql        = '';
        $col_names  = array_keys($rows[0]);
        $cols_str   = '`' . implode('`, `', $col_names) . '`';

        foreach ($rows as $row) {
            $values = [];
            foreach ($row as $val) {
                if ($val === null) {
                    $values[] = 'NULL';
                } else {
                    $values[] = "'" . esc_sql($val) . "'";
                }
            }
            $sql .= "INSERT INTO `{$table}` ({$cols_str}) VALUES (" . implode(', ', $values) . ");\n";
        }

        $count = count($rows);
        $done  = ($count < $chunk);

        return ['sql' => $sql, 'count' => $count, 'done' => $done];
    }

    /**
     * Lấy tổng số row của 1 bảng
     */
    public static function get_table_row_count($table)
    {
        global $wpdb;
        $table = esc_sql($table);
        return (int) $wpdb->get_var("SELECT COUNT(*) FROM `{$table}`");
    }

    /**
     * Ghi SQL header cho file dump
     */
    public static function get_dump_header()
    {
        global $wpdb;
        $header  = "-- Foxblock Database Backup\n";
        $header .= "-- Generated: " . date('Y-m-d H:i:s') . "\n";
        $header .= "-- WordPress: " . get_bloginfo('version') . "\n";
        $header .= "-- Site URL: " . get_site_url() . "\n";
        $header .= "-- Table Prefix: " . $wpdb->prefix . "\n";
        $header .= "\n";
        $header .= "SET FOREIGN_KEY_CHECKS=0;\n";
        $header .= "SET SQL_MODE='NO_AUTO_VALUE_ON_ZERO';\n";
        $header .= "SET NAMES utf8mb4;\n\n";
        return $header;
    }

    /**
     * Ghi SQL footer
     */
    public static function get_dump_footer()
    {
        return "\nSET FOREIGN_KEY_CHECKS=1;\n-- End of backup\n";
    }
}
