// 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 "@dictionary required"

pub status "#bad checksum"
pub status "#bad compression method"
pub status "#bad compression window size"
pub status "#bad parity check"
pub status "#incorrect dictionary"

// 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?(
	bad_call_sequence base.bool,
	header_complete   base.bool,

	got_dictionary  base.bool,
	want_dictionary base.bool,

	ignore_checksum base.bool,
	checksum        adler32.hasher,

	dict_id_hasher adler32.hasher,
	dict_id_got    base.u32,
	dict_id_want   base.u32,

	flate deflate.decoder,

	util base.utility,
)

pub func decoder.dictionary_id() base.u32 {
	return this.dict_id_want
}

pub func decoder.add_dictionary!(dict slice base.u8) {
	if this.header_complete {
		this.bad_call_sequence = true
	} else {
		this.dict_id_got = this.dict_id_hasher.update!(x:args.dict)
		this.flate.add_history!(hist:args.dict)
	}
	this.got_dictionary = true
}

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 x             base.u16
	var checksum_got  base.u32
	var status        base.status
	var checksum_want base.u32
	var mark          base.u64

	if this.bad_call_sequence {
		return base."#bad call sequence"
	} else if not this.want_dictionary {
		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 % 31) <> 0 {
			return "#bad parity check"
		}
		this.want_dictionary = (x & 0x20) <> 0
		if this.want_dictionary {
			this.dict_id_got = 1  // Adler-32 initial value.
			this.dict_id_want = args.src.read_u32be?()
			return "@dictionary required"
		} else if this.got_dictionary {
			return "#incorrect dictionary"
		}
	} else if this.dict_id_got <> this.dict_id_want {
		if this.got_dictionary {
			return "#incorrect dictionary"
		}
		return "@dictionary required"
	}

	this.header_complete = true

	// 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))
		}
		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"
	}

	// TODO: reset state (e.g. want_dictionary), so that we can read concat'ed
	// zlib streams?
}
