// basisu_basis_file.h
// Copyright (C) 2019 Binomial LLC. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//    http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#pragma once
#include "transcoder/basisu_file_headers.h"
#include "basisu_backend.h"

namespace basisu
{
	class basisu_file
	{
		BASISU_NO_EQUALS_OR_COPY_CONSTRUCT(basisu_file);

	public:
		basisu_file()
		{
		}

		void clear()
		{
			m_comp_data.clear();

			clear_obj(m_header);
			m_images_descs.clear();

			m_header_file_ofs = 0;
			m_slice_descs_file_ofs = 0;
			m_endpoint_cb_file_ofs = 0;
			m_selector_cb_file_ofs = 0;
			m_tables_file_ofs = 0;
			m_first_image_file_ofs = 0;
			m_total_file_size = 0;
		}

		bool init(const basisu_backend_output& encoder_output, basist::basis_texture_type tex_type, uint32_t userdata0, uint32_t userdata1, bool y_flipped, uint32_t us_per_frame);

		const uint8_vec &get_compressed_data() const { return m_comp_data; }

	private:
		basist::basis_file_header m_header;
		std::vector<basist::basis_slice_desc> m_images_descs;

		uint8_vec m_comp_data;

		uint32_t m_header_file_ofs;
		uint32_t m_slice_descs_file_ofs;
		uint32_t m_endpoint_cb_file_ofs;
		uint32_t m_selector_cb_file_ofs;
		uint32_t m_tables_file_ofs;
		uint32_t m_first_image_file_ofs;
		uint32_t m_total_file_size;

		void create_header(const basisu_backend_output& encoder_output,  basist::basis_texture_type tex_type, uint32_t userdata0, uint32_t userdata1, bool y_flipped, uint32_t us_per_frame);
		bool create_image_descs(const basisu_backend_output& encoder_output);
		void create_comp_data(const basisu_backend_output& encoder_output);
		void fixup_crcs();
	};

} // namespace basisu
