// Copyright 2017 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/adler32"
use "std/deflate"

pub status "?bad checksum"
pub status "?bad compression method"
pub status "?bad compression window size"
pub status "?bad parity check"

pri status "?TODO: unsupported preset dictionary"

// TODO: reference deflate.decoder_workbuf_len_max_incl.
pub const decoder_workbuf_len_max_incl base.u64 = 32768 + 512

pub struct decoder?(
	flate           deflate.decoder,
	checksum        adler32.hasher,
	ignore_checksum base.bool,
	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,
		max_incl:decoder_workbuf_len_max_incl)
}

pub func decoder.decode_io_writer?(dst base.io_writer, src base.io_reader, workbuf slice base.u8) {
	var x             base.u16
	var checksum_got  base.u32
	var status        base.status
	var checksum_want base.u32

	x = args.src.read_u16be?()
	if ((x >> 8) & 0x0F) != 0x08 {
		return "?bad compression method"
	}
	if (x >> 12) > 0x07 {
		return "?bad compression window size"
	}
	if (x & 0x20) != 0 {
		return "?TODO: unsupported preset dictionary"
	}
	if (x % 31) != 0 {
		return "?bad parity check"
	}

	// Decode and checksum the DEFLATE-encoded payload.
	while true {
		args.dst.set_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())
		}
		if status.is_ok() {
			break
		}
		yield status
	}
	checksum_want = args.src.read_u32be?()
	if (not this.ignore_checksum) and (checksum_got != checksum_want) {
		return "?bad checksum"
	}
}
