package org.ansj.splitWord.impl;

import org.ansj.domain.AnsjItem;
import org.ansj.library.DATDictionary;
import org.ansj.splitWord.GetWords;

public class GetWordsImpl implements GetWords {

	/**
	 * offe : 当前词的偏移量
	 */
	public int offe;

	/**
	 * 构造方法，同时加载词典,传入词语相当于同时调用了setStr() ;
	 */
	public GetWordsImpl(String str) {
		setStr(str);
	}

	/**
	 * 构造方法，同时加载词典
	 */
	public GetWordsImpl() {
	}

	int charsLength = 0;

	@Override
	public void setStr(String str) {
		setChars(str.toCharArray(), 0, str.length());
	}

	@Override
	public void setChars(char[] chars, int start, int end) {
		this.chars = chars;
		i = start;
		this.start = start;
		charsLength = end;
		checkValue = 0;
	}

	public char[] chars;
	private int charHashCode;
	private int start = 0;
	public int end = 0;
	private int baseValue = 0;
	private int checkValue = 0;
	private int tempBaseValue = 0;
	public int i = 0;
	private String str = null;

	@Override
	public String allWords() {
		for (; i < charsLength; i++) {
			charHashCode = chars[i];
			end++;
			switch (getStatement()) {
				case 0:
					if (baseValue == chars[i]) {
						str = String.valueOf(chars[i]);
						offe = i;
						start = ++i;
						end = 0;
						baseValue = 0;
						tempBaseValue = baseValue;
						return str;
					} else {
						int startCharStatus = DATDictionary.getItem(chars[start]).getStatus();
						if (startCharStatus == 1) { //如果start的词的status为1，则将start设为i；否则start加1
							start = i;
							i--;
							end = 0;
							baseValue = 0;
						} else {
							i = start;
							start++;
							end = 0;
							baseValue = 0;
						}
						break;
					}
				case 2:
					i++;
					offe = start;
					tempBaseValue = baseValue;
					return DATDictionary.getItem(tempBaseValue).getName();
				case 3:
					offe = start;
					start++;
					i = start;
					end = 0;
					tempBaseValue = baseValue;
					baseValue = 0;
					return DATDictionary.getItem(tempBaseValue).getName();
			}

		}
		end = 0;
		baseValue = 0;
		i = 0;
		return null;
	}

	/**
	 * 根据用户传入的c得到单词的状态. 0.代表这个字不在词典中 1.继续 2.是个词但是还可以继续 3.停止已经是个词了
	 *
	 * @param c
	 * @return
	 */
	private int getStatement() {
		checkValue = baseValue;
		baseValue = DATDictionary.getItem(checkValue).getBase() + charHashCode;
		if (baseValue < DATDictionary.arrayLength) {
			AnsjItem temp = DATDictionary.getItem(baseValue);
			if (temp.getCheck() == checkValue || temp.getCheck() == -1) {
				return DATDictionary.getItem(baseValue).getStatus();
			}
		}
		return 0;
	}

	public AnsjItem getItem() {
		return DATDictionary.getItem(tempBaseValue);
	}

	@Override
	public int getOffe() {
		return offe;
	}

}
