<?php
/**
 * StateManager - Quản lý trạng thái backup/restore
 *
 * Lưu state vào WordPress options để hỗ trợ resume nếu bị gián đoạn.
 */

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

class Foxblock_Backup_StateManager
{
    const OPTION_BACKUP_STATE  = 'foxblock_backup_state';
    const OPTION_RESTORE_STATE = 'foxblock_restore_state';

    /**
     * Lấy trạng thái backup hiện tại
     */
    public static function get_backup_state()
    {
        $state = get_option(self::OPTION_BACKUP_STATE, null);
        if (empty($state) || !is_array($state)) {
            return null;
        }
        return $state;
    }

    /**
     * Lưu trạng thái backup
     */
    public static function save_backup_state(array $state)
    {
        $state['updated_at'] = time();
        update_option(self::OPTION_BACKUP_STATE, $state, false);
    }

    /**
     * Xóa trạng thái backup (khi hoàn tất hoặc lỗi)
     */
    public static function clear_backup_state()
    {
        delete_option(self::OPTION_BACKUP_STATE);
    }

    /**
     * Khởi tạo state backup mới
     */
    public static function init_backup_state(array $meta = [])
    {
        $backup_id = 'backup_' . date('Y-m-d-H-i-s') . '_' . substr(uniqid(), -4);
        $temp_dir  = wp_upload_dir()['basedir'] . '/foxblock_temp/' . $backup_id;

        $state = [
            'step'            => 'scan_files',
            'backup_id'       => $backup_id,
            'temp_dir'        => $temp_dir,
            'archive_path'    => '',
            'file_list'       => [],
            'file_offset'     => 0,
            'db_tables'       => [],
            'db_table_index'  => 0,
            'db_row_offset'   => 0,
            'progress'        => 0,
            'current_file'    => '',
            'started_at'      => time(),
            'updated_at'      => time(),
            'meta'            => array_merge([
                'site_url'      => get_site_url(),
                'blog_name'     => get_bloginfo('name'),
                'wp_version'    => get_bloginfo('version'),
                'table_prefix'  => $GLOBALS['wpdb']->prefix,
                'created_at'    => date('Y-m-d H:i:s'),
            ], $meta),
        ];

        update_option(self::OPTION_BACKUP_STATE, $state, false);
        return $state;
    }

    public static function get_restore_state_file()
    {
        $dir = wp_upload_dir()['basedir'] . '/foxblock_temp';
        if (!is_dir($dir)) wp_mkdir_p($dir);
        return $dir . '/restore_state.json';
    }

    /**
     * Lấy trạng thái restore hiện tại
     */
    public static function get_restore_state()
    {
        $file = self::get_restore_state_file();
        if (file_exists($file)) {
            $json = file_get_contents($file);
            if ($json) {
                return json_decode($json, true);
            }
        }
        return null;
    }

    /**
     * Lưu trạng thái restore
     */
    public static function save_restore_state(array $state)
    {
        $state['updated_at'] = time();
        $file = self::get_restore_state_file();
        file_put_contents($file, wp_json_encode($state));
    }

    /**
     * Xóa trạng thái restore
     */
    public static function clear_restore_state()
    {
        $file = self::get_restore_state_file();
        if (file_exists($file)) {
            @unlink($file);
        }
    }

    /**
     * Khởi tạo state restore mới
     */
    public static function init_restore_state(string $archive_path)
    {
        $temp_dir = wp_upload_dir()['basedir'] . '/foxblock_temp/restore_' . time();

        $state = [
            'step'            => 'extract',
            'archive_path'    => $archive_path,
            'temp_dir'        => $temp_dir,
            'sql_file'        => '',
            'file_manifest'   => [],
            'file_offset'     => 0,
            'sql_line_offset' => 0,
            'old_domain'      => '',
            'new_domain'      => get_site_url(),
            'progress'        => 0,
            'started_at'      => time(),
            'updated_at'      => time(),
            'restore_token'   => wp_generate_password(32, false),
        ];

        self::save_restore_state($state);
        return $state;
    }

    /**
     * Kiểm tra timeout: nếu state không cập nhật > 10 phút, coi là expired
     */
    public static function is_backup_expired()
    {
        $state = self::get_backup_state();
        if (!$state) return true;
        return (time() - $state['updated_at']) > 600;
    }

    public static function is_restore_expired()
    {
        $state = self::get_restore_state();
        if (!$state) return true;
        return (time() - $state['updated_at']) > 600;
    }
}
