package io.codearte.jfairy.producer.person.locale.en;

import com.google.common.collect.Lists;
import com.google.inject.Inject;
import io.codearte.jfairy.producer.BaseProducer;
import io.codearte.jfairy.producer.VATIdentificationNumberProvider;
import io.codearte.jfairy.producer.person.NationalIdentityCardNumberProvider;

import java.util.List;

import static java.lang.String.valueOf;
import static java.lang.System.arraycopy;
import static org.apache.commons.lang3.StringUtils.leftPad;

/**
 * English National Identity Card Number (known as Social Security Number)
 *
 * @author Olga Maciaszek-Sharma
 * @since 15.03.15
 */
public class EnNationalIdentityCardNumberProvider implements NationalIdentityCardNumberProvider, VATIdentificationNumberProvider {

	private static final int SSN_LENGTH = 11;
	private static final int AREA_NUMBER_LENGTH = 3;
	private static final int GROUP_NUMBER_LENGTH = 2;
	private static final int GROUP_NUMBER_INDEX = 4;
	private static final List<Integer> HYPHEN_INDEXES = Lists.newArrayList(3, 6);
	private static final int SERIAL_NUMBER_LENGTH = 4;
	private static final int SERIAL_NUMBER_INDEX = 7;

	private final BaseProducer baseProducer;

	@Inject
	public EnNationalIdentityCardNumberProvider(BaseProducer baseProducer) {
		this.baseProducer = baseProducer;
	}

	@Override
	public String get() {
		char[] ssn = new char[SSN_LENGTH];

		fillHyphens(ssn);

		fillAreaNumber(ssn);

		fillGroupNumber(ssn);

		fillSerialNumber(ssn);

		return valueOf(ssn);
	}

	private void fillHyphens(char[] ssn) {
		for (Integer index : HYPHEN_INDEXES) {
			ssn[index] = '-';
		}
	}

	private void fillAreaNumber(char[] ssn) {
		String number;
		do {
			number = valueOf(baseProducer.randomBetween(1, 899));
		} while (number.equals("666"));
		char[] digits = leftPad(number, AREA_NUMBER_LENGTH, "0").toCharArray();
		arraycopy(digits, 0, ssn, 0, digits.length);
	}

	private void fillGroupNumber(char[] ssn) {
		String number = valueOf(baseProducer.randomBetween(1, 99));
		char[] digits = leftPad(number, GROUP_NUMBER_LENGTH, "0").toCharArray();
		arraycopy(digits, 0, ssn, GROUP_NUMBER_INDEX, digits.length);
	}

	private void fillSerialNumber(char[] ssn) {
		String number = valueOf(baseProducer.randomBetween(1, 9999));
		char[] digits = leftPad(number, SERIAL_NUMBER_LENGTH, "0").toCharArray();
		arraycopy(digits, 0, ssn, SERIAL_NUMBER_INDEX, digits.length);
	}

}


@@ -721,41 +721,8 @@
 ider
-, VATIdentificationNumberProvider
  %7B%0A%0A

Remove that EnNationalIdentityCardNumberProvider incorrectly implements VATIdentificationNumberProvider