// Copyright 2018 The Wuffs Authors.
//
// 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
//
//    https://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.

use "std/crc32"
use "std/deflate"

pub status "#bad checksum"
pub status "#bad compression method"
pub status "#bad encoding flags"
pub status "#bad header"

// TODO: reference deflate.decoder_workbuf_len_max_incl_worst_case.
pub const decoder_workbuf_len_max_incl_worst_case base.u64 = 1

pub struct decoder?(
	ignore_checksum base.bool,
	checksum        crc32.ieee_hasher,

	flate deflate.decoder,

	util base.utility,
)

pub func decoder.set_ignore_checksum!(ic base.bool) {
	this.ignore_checksum = args.ic
}

pub func decoder.workbuf_len() base.range_ii_u64 {
	return this.util.make_range_ii_u64(
		min_incl:decoder_workbuf_len_max_incl_worst_case,
		max_incl:decoder_workbuf_len_max_incl_worst_case)
}

pub func decoder.decode_io_writer?(dst base.io_writer, src base.io_reader, workbuf slice base.u8) {
	var c                   base.u8
	var flags               base.u8
	var xlen                base.u16
	var mark                base.u64
	var checksum_got        base.u32
	var decoded_length_got  base.u32
	var status              base.status
	var checksum_want       base.u32
	var decoded_length_want base.u32

	// Read the header.
	c = args.src.read_u8?()
	if c <> 0x1F {
		return "#bad header"
	}
	c = args.src.read_u8?()
	if c <> 0x8B {
		return "#bad header"
	}
	c = args.src.read_u8?()
	if c <> 0x08 {
		return "#bad compression method"
	}
	flags = args.src.read_u8?()
	// TODO: API for returning the header's MTIME field.
	args.src.skip?(n:6)

	// Handle FEXTRA.
	if (flags & 0x04) <> 0 {
		xlen = args.src.read_u16le?()
		args.src.skip?(n:xlen as base.u32)
	}

	// Handle FNAME.
	//
	// TODO: API for returning the header's FNAME field. This might require
	// converting ISO 8859-1 to UTF-8. We may also want to cap the UTF-8
	// filename length to NAME_MAX, which is 255.
	if (flags & 0x08) <> 0 {
		while true {
			c = args.src.read_u8?()
			if c == 0 {
				break
			}
		}
	}

	// Handle FCOMMENT.
	if (flags & 0x10) <> 0 {
		while true {
			c = args.src.read_u8?()
			if c == 0 {
				break
			}
		}
	}

	// Handle FHCRC.
	if (flags & 0x02) <> 0 {
		args.src.skip?(n:2)
	}

	// Reserved flags bits must be zero.
	if (flags & 0xE0) <> 0 {
		return "#bad encoding flags"
	}

	// Decode and checksum the DEFLATE-encoded payload.
	while true {
		mark = args.dst.mark()
		status =? this.flate.decode_io_writer?(dst:args.dst, src:args.src, workbuf:args.workbuf)
		if not this.ignore_checksum {
			checksum_got = this.checksum.update!(x:args.dst.since(mark:mark))
			decoded_length_got ~mod+= ((args.dst.count_since(mark:mark) & 0xFFFFFFFF) as base.u32)
		}
		if status.is_ok() {
			break
		}
		yield? status
	}
	checksum_want = args.src.read_u32le?()
	decoded_length_want = args.src.read_u32le?()
	if (not this.ignore_checksum) and
		((checksum_got <> checksum_want) or (decoded_length_got <> decoded_length_want)) {
		return "#bad checksum"
	}
}
