// Copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package flate

import (
	"math";
	"sort";
)

type huffmanEncoder struct {
	codeBits	[]uint8;
	code		[]uint16;
}

type literalNode struct {
	literal	uint16;
	freq	int32;
}

type chain struct {
	// The sum of the leaves in this tree
	freq	int32;

	// The number of literals to the left of this item at this level
	leafCount	int32;

	// The right child of this chain in the previous level.
	up	*chain;
}

type levelInfo struct {
	// Our level.  for better printing
	level	int32;

	// The most recent chain generated for this level
	lastChain	*chain;

	// The frequency of the next character to add to this level
	nextCharFreq	int32;

	// The frequency of the next pair (from level below) to add to this level.
	// Only valid if the "needed" value of the next lower level is 0.
	nextPairFreq	int32;

	// The number of chains remaining to generate for this level before moving
	// up to the next level
	needed	int32;

	// The levelInfo for level+1
	up	*levelInfo;

	// The levelInfo for level-1
	down	*levelInfo;
}

func maxNode() literalNode	{ return literalNode{math.MaxUint16, math.MaxInt32} }

func newHuffmanEncoder(size int) *huffmanEncoder {
	return &huffmanEncoder{make([]uint8, size), make([]uint16, size)}
}

// Generates a HuffmanCode corresponding to the fixed literal table
func generateFixedLiteralEncoding() *huffmanEncoder {
	h := newHuffmanEncoder(maxLit);
	codeBits := h.codeBits;
	code := h.code;
	var ch uint16;
	for ch = 0; ch < maxLit; ch++ {
		var bits uint16;
		var size uint8;
		switch {
		case ch < 144:
			// size 8, 000110000  .. 10111111
			bits = ch + 48;
			size = 8;
			break;
		case ch < 256:
			// size 9, 110010000 .. 111111111
			bits = ch + 400 - 144;
			size = 9;
			break;
		case ch < 280:
			// size 7, 0000000 .. 0010111
			bits = ch - 256;
			size = 7;
			break;
		default:
			// size 8, 11000000 .. 11000111
			bits = ch + 192 - 280;
			size = 8;
		}
		codeBits[ch] = size;
		code[ch] = reverseBits(bits, size);
	}
	return h;
}

func generateFixedOffsetEncoding() *huffmanEncoder {
	h := newHuffmanEncoder(30);
	codeBits := h.codeBits;
	code := h.code;
	for ch := uint16(0); ch < 30; ch++ {
		codeBits[ch] = 5;
		code[ch] = reverseBits(ch, 5);
	}
	return h;
}

var fixedLiteralEncoding *huffmanEncoder = generateFixedLiteralEncoding()
var fixedOffsetEncoding *huffmanEncoder = generateFixedOffsetEncoding()

func (h *huffmanEncoder) bitLength(freq []int32) int64 {
	var total int64;
	for i, f := range freq {
		if f != 0 {
			total += int64(f) * int64(h.codeBits[i])
		}
	}
	return total;
}

// Generate elements in the chain using an iterative algorithm.
func (h *huffmanEncoder) generateChains(top *levelInfo, list []literalNode) {
	n := len(list);
	list = list[0 : n+1];
	list[n] = maxNode();

	l := top;
	for {
		if l.nextPairFreq == math.MaxInt32 && l.nextCharFreq == math.MaxInt32 {
			// We've run out of both leafs and pairs.
			// End all calculations for this level.
			// To m sure we never come back to this level or any lower level,
			// set nextPairFreq impossibly large.
			l.lastChain = nil;
			l.needed = 0;
			l = l.up;
			l.nextPairFreq = math.MaxInt32;
			continue;
		}

		prevFreq := l.lastChain.freq;
		if l.nextCharFreq < l.nextPairFreq {
			// The next item on this row is a leaf node.
			n := l.lastChain.leafCount + 1;
			l.lastChain = &chain{l.nextCharFreq, n, l.lastChain.up};
			l.nextCharFreq = list[n].freq;
		} else {
			// The next item on this row is a pair from the previous row.
			// nextPairFreq isn't valid until we generate two
			// more values in the level below
			l.lastChain = &chain{l.nextPairFreq, l.lastChain.leafCount, l.down.lastChain};
			l.down.needed = 2;
		}

		if l.needed--; l.needed == 0 {
			// We've done everything we need to do for this level.
			// Continue calculating one level up.  Fill in nextPairFreq
			// of that level with the sum of the two nodes we've just calculated on
			// this level.
			up := l.up;
			if up == nil {
				// All done!
				return
			}
			up.nextPairFreq = prevFreq + l.lastChain.freq;
			l = up;
		} else {
			// If we stole from below, move down temporarily to replenish it.
			for l.down.needed > 0 {
				l = l.down
			}
		}
	}
}

// Return the number of literals assigned to each bit size in the Huffman encoding
//
// This method is only called when list.length >= 3
// The cases of 0, 1, and 2 literals are handled by special case code.
//
// list  An array of the literals with non-zero frequencies
//             and their associated frequencies.  The array is in order of increasing
//             frequency, and has as its last element a special element with frequency
//             MaxInt32
// maxBits     The maximum number of bits that should be used to encode any literal.
// return      An integer array in which array[i] indicates the number of literals
//             that should be encoded in i bits.
func (h *huffmanEncoder) bitCounts(list []literalNode, maxBits int32) []int32 {
	n := int32(len(list));
	list = list[0 : n+1];
	list[n] = maxNode();

	// The tree can't have greater depth than n - 1, no matter what.  This
	// saves a little bit of work in some small cases
	maxBits = minInt32(maxBits, n-1);

	// Create information about each of the levels.
	// A bogus "Level 0" whose sole purpose is so that
	// level1.prev.needed==0.  This makes level1.nextPairFreq
	// be a legitimate value that never gets chosen.
	top := &levelInfo{needed: 0};
	chain2 := &chain{list[1].freq, 2, new(chain)};
	for level := int32(1); level <= maxBits; level++ {
		// For every level, the first two items are the first two characters.
		// We initialize the levels as if we had already figured this out.
		top = &levelInfo{
			level: level,
			lastChain: chain2,
			nextCharFreq: list[2].freq,
			nextPairFreq: list[0].freq + list[1].freq,
			down: top,
		};
		top.down.up = top;
		if level == 1 {
			top.nextPairFreq = math.MaxInt32
		}
	}

	// We need a total of 2*n - 2 items at top level and have already generated 2.
	top.needed = 2*n - 4;

	l := top;
	for {
		if l.nextPairFreq == math.MaxInt32 && l.nextCharFreq == math.MaxInt32 {
			// We've run out of both leafs and pairs.
			// End all calculations for this level.
			// To m sure we never come back to this level or any lower level,
			// set nextPairFreq impossibly large.
			l.lastChain = nil;
			l.needed = 0;
			l = l.up;
			l.nextPairFreq = math.MaxInt32;
			continue;
		}

		prevFreq := l.lastChain.freq;
		if l.nextCharFreq < l.nextPairFreq {
			// The next item on this row is a leaf node.
			n := l.lastChain.leafCount + 1;
			l.lastChain = &chain{l.nextCharFreq, n, l.lastChain.up};
			l.nextCharFreq = list[n].freq;
		} else {
			// The next item on this row is a pair from the previous row.
			// nextPairFreq isn't valid until we generate two
			// more values in the level below
			l.lastChain = &chain{l.nextPairFreq, l.lastChain.leafCount, l.down.lastChain};
			l.down.needed = 2;
		}

		if l.needed--; l.needed == 0 {
			// We've done everything we need to do for this level.
			// Continue calculating one level up.  Fill in nextPairFreq
			// of that level with the sum of the two nodes we've just calculated on
			// this level.
			up := l.up;
			if up == nil {
				// All done!
				break
			}
			up.nextPairFreq = prevFreq + l.lastChain.freq;
			l = up;
		} else {
			// If we stole from below, move down temporarily to replenish it.
			for l.down.needed > 0 {
				l = l.down
			}
		}
	}


	// Somethings is wrong if at the end, the top level is null or hasn't used
	// all of the leaves.
	if top.lastChain.leafCount != n {
		panic("top.lastChain.leafCount != n")
	}

	bitCount := make([]int32, maxBits+1);
	bits := 1;
	for chain := top.lastChain; chain.up != nil; chain = chain.up {
		// chain.leafCount gives the number of literals requiring at least "bits"
		// bits to encode.
		bitCount[bits] = chain.leafCount - chain.up.leafCount;
		bits++;
	}
	return bitCount;
}

// Look at the leaves and assign them a bit count and an encoding as specified
// in RFC 1951 3.2.2
func (h *huffmanEncoder) assignEncodingAndSize(bitCount []int32, list []literalNode) {
	code := uint16(0);
	for n, bits := range bitCount {
		code <<= 1;
		if n == 0 || bits == 0 {
			continue
		}
		// The literals list[len(list)-bits] .. list[len(list)-bits]
		// are encoded using "bits" bits, and get the values
		// code, code + 1, ....  The code values are
		// assigned in literal order (not frequency order).
		chunk := list[len(list)-int(bits) : len(list)];
		sortByLiteral(chunk);
		for _, node := range chunk {
			h.codeBits[node.literal] = uint8(n);
			h.code[node.literal] = reverseBits(code, uint8(n));
			code++;
		}
		list = list[0 : len(list)-int(bits)];
	}
}

// Update this Huffman Code object to be the minimum code for the specified frequency count.
//
// freq  An array of frequencies, in which frequency[i] gives the frequency of literal i.
// maxBits  The maximum number of bits to use for any literal.
func (h *huffmanEncoder) generate(freq []int32, maxBits int32) {
	list := make([]literalNode, len(freq)+1);
	// Number of non-zero literals
	count := 0;
	// Set list to be the set of all non-zero literals and their frequencies
	for i, f := range freq {
		if f != 0 {
			list[count] = literalNode{uint16(i), f};
			count++;
		} else {
			h.codeBits[i] = 0
		}
	}
	// If freq[] is shorter than codeBits[], fill rest of codeBits[] with zeros
	h.codeBits = h.codeBits[0:len(freq)];
	list = list[0:count];
	if count <= 2 {
		// Handle the small cases here, because they are awkward for the general case code.  With
		// two or fewer literals, everything has bit length 1.
		for i, node := range list {
			// "list" is in order of increasing literal value.
			h.codeBits[node.literal] = 1;
			h.code[node.literal] = uint16(i);
		}
		return;
	}
	sortByFreq(list);

	// Get the number of literals for each bit count
	bitCount := h.bitCounts(list, maxBits);
	// And do the assignment
	h.assignEncodingAndSize(bitCount, list);
}

type literalNodeSorter struct {
	a	[]literalNode;
	less	func(i, j int) bool;
}

func (s literalNodeSorter) Len() int	{ return len(s.a) }

func (s literalNodeSorter) Less(i, j int) bool {
	return s.less(i, j)
}

func (s literalNodeSorter) Swap(i, j int)	{ s.a[i], s.a[j] = s.a[j], s.a[i] }

func sortByFreq(a []literalNode) {
	s := &literalNodeSorter{a, func(i, j int) bool { return a[i].freq < a[j].freq }};
	sort.Sort(s);
}

func sortByLiteral(a []literalNode) {
	s := &literalNodeSorter{a, func(i, j int) bool { return a[i].literal < a[j].literal }};
	sort.Sort(s);
}
