#include "rw_texture2d.h"

#include <iostream>

#include "image_accessor_factory.h"

void rw_texture2d::update(const sg_image_data& in_data) {
	sg_update_image(get_image(), in_data);
}

void rw_texture2d::resize(const Eigen::Vector2i& in_size) {
	const auto& current_size = get_size();

	// 如果大小相同，直接返回
	if (current_size == in_size) { return; }

	// 保存当前纹理数据（如果有有效数据）
	std::vector<std::byte> old_data;
	Eigen::Vector2i old_size;

	if (is_valid() && current_size.x() > 0 && current_size.y() > 0) {
		try {
			// 映射当前纹理进行读取
			old_data = read();
			old_size = current_size;
		}
		catch (const std::exception& e) {
			// 读取失败，继续创建空纹理
			std::cerr << "Error reading texture data: " << e.what() << std::endl;
		}
	}

	// 创建新纹理
	sg_image_desc desc = get_image_desc();
	desc.width         = in_size.x();
	desc.height        = in_size.y();

	// 清除旧的图像
	clear();

	// 创建新的图像
	create_from_desc(desc);

	// 如果有旧数据，尝试恢复
	if (!old_data.empty() && old_size.x() > 0 && old_size.y() > 0) {
		// 计算复制区域
		const auto copy_size = Eigen::Vector2i(std::min(old_size.x(), in_size.x()), std::min(old_size.y(), in_size.y()));
		const auto copy_rect = rect_t<int32_t>(Eigen::Vector2i::Zero(), copy_size);

		// 更新纹理数据
		sub_update(SG_RANGE(old_data), copy_rect);
	}
}
