package org.dicadeveloper.weplantaforest.code;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import org.dicadeveloper.weplantaforest.common.code.CodeHelper;
import org.dicadeveloper.weplantaforest.event.Event;
import org.dicadeveloper.weplantaforest.gift.Gift;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class CodeGenerator {
@Autowired
CodeRepository _codeRepository;
public List<Code> generate(final Event event, final int count, final int treeCount) {
final Calendar cal = Calendar.getInstance();
final int year = cal.get(Calendar.YEAR);
final int month = cal.get(Calendar.MONTH);
int from = 0;
for (final Code code : event.getCodes()) {
final int number = code.getNumber();
if (number > from) {
from = number + 1;
}
}
final int to = from + count;
final List<Code> codes = new ArrayList<Code>();
for (int i = from; i < to; i++) {
Code code = generate(event, year, month, i);
codes.add(code);
}
return codes;
}
public List<Code> generate(final Event event, final int count, final float price) {
final Calendar cal = Calendar.getInstance();
final int year = cal.get(Calendar.YEAR);
final int month = cal.get(Calendar.MONTH);
int from = 0;
for (final Code code : event.getCodes()) {
final int number = code.getNumber();
if (number > from) {
from = number + 1;
}
}
final int to = from + count;
final List<Code> codes = new ArrayList<Code>();
for (int i = from; i < to; i++) {
Code code = generate(event, year, month, i);
codes.add(code);
}
return codes;
}
public Code generate(final Gift gift) {
final Calendar cal = Calendar.getInstance();
return generate(null, gift, cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), 0);
}
public Code generate(final Gift gift, final int year, final int month, final int number) {
return generate(null, gift, year, month, number);
}
public Code generate(final Event event, final int year, final int month, final int number) {
return generate(event, null, year, month, number);
}
private Code generate(final Event event, final Gift gift, int year, final int month, int number) {
Code code = new Code();
code.setEvent(event);
code.setGift(gift);
code.setYear(year);
code.setMonth(month);
code.setNumber(number);
// save code or try generate a new one
boolean codeSaved = false;
while (!codeSaved) {
final String codeString = CodeHelper.generateCodeString();
if (null == _codeRepository.findByCode(codeString)) {
code.setCode(codeString);
code = _codeRepository.save(code);
codeSaved = true;
}
}
return code;
}
public boolean isValid(final String code) {
if (CodeHelper.isValid(code)) {
return _codeRepository.findByCode(code) != null;
} else {
return false;
}
}
}