#pragma once
#include <memory>
#include <optional>
#include <span>
#include <string>
#include <vector>
#include <whiteout/common_types.h>
#include <whiteout/textures/parser.h>
#include <whiteout/textures/tex/types.h>
#include <whiteout/textures/texture.h>
namespace whiteout::textures::tex {
class Parser : public textures::Parser {
public:
enum class FileKind {
Unknown, Diablo3Tex, Diablo4MetaTex };
Parser();
~Parser();
Parser(const Parser&) = delete;
Parser& operator=(const Parser&) = delete;
std::optional<Texture> parse(const std::string& filePath) override;
std::optional<Texture> parse(std::span<const u8> buffer) override;
std::optional<Texture> parse(std::span<const u8> buffer, TexInfo* outInfo);
FileKind detectKind(std::span<const u8> buffer) const;
FileKind detectKind(const std::string& filePath) const;
std::optional<Texture> parse(const std::string& texFilePath,
const std::string& payloadFilePath);
std::optional<Texture> parse(std::span<const u8> texData, std::span<const u8> payloadData);
std::optional<Texture> parse(std::span<const u8> texData, std::span<const u8> payloadData,
D4TexInfo* outInfo);
std::optional<Texture> parse(const std::string& texFilePath,
const std::string& hiResPayloadFilePath,
const std::string& lowResPayloadFilePath);
std::optional<Texture> parse(std::span<const u8> texData, std::span<const u8> hiResPayloadData,
std::span<const u8> lowResPayloadData, D4TexInfo* outInfo);
bool hasIssues() const;
const std::vector<std::string>& getIssues() const;
private:
class Impl;
std::unique_ptr<Impl> pImpl;
};
}