package ru.rsdn.defensive.sample;

import net.sf.oval.constraint.MatchPattern;
import net.sf.oval.constraint.NotNull;
import net.sf.oval.constraint.PossibleLength;
import net.sf.oval.guard.Guarded;

/**
 * Компания
 */
@Guarded
public class Company {
	private static final String NO_NAME_MESSAGE = "Не указано название";

	private static final String NO_TIN_MESSAGE = "Не указан ИНН";

	private static final String ONLY_NUMBERS_TIN_MESSAGE = "ИНН должен содержать только цифры";

	private static final String COUNT_NUMBERS_TIN_MESSAGE = "ИНН должен содержать 10 цифр";

	private static final String NO_EMAIL_MESSAGE = "Не указана электронная почта";

	private static final String INVALID_EMAIL_MESSAGE = "Некорректная электронная почта";

	@NotNull(message = NO_NAME_MESSAGE)
	private String name;

	@NotNull(message = NO_TIN_MESSAGE)
	@MatchPattern(pattern = "^\\d*$", message = ONLY_NUMBERS_TIN_MESSAGE)
	@PossibleLength(lengths = { 0, 10 }, message = COUNT_NUMBERS_TIN_MESSAGE)
	private String tin;

	@NotNull(message = NO_EMAIL_MESSAGE)
	@MatchPattern(pattern = "^(([a-z0-9]{1,}[\\.\\_\\-]?[a-z0-9]{1,})\\@([a-z0-9]{1,}[\\-]?[a-z0-9.]{1,}\\.)([a-z]{2,2}|org|net|com|gov|edu|int|info|biz|museum))?$", message = INVALID_EMAIL_MESSAGE)
	private String email;

	public Company() {
		name = "";
		tin = "";
		email = "";
	}

	/**
	 * Конструктор
	 * @param _name название
	 * @param _tin ИНН
	 * @param _email электронная почта
	 */
	public Company(String _name, String _tin, String _email) {
		name = _name;
		tin = _tin;
		email = _email;
	}

	/**
	 * @return название
	 */
	public String getName() {
		return name;
	}

	/**
	 * @return ИНН
	 */
	public String getTin() {
		return tin;
	}

	/**
	 * @return электронная почта
	 */
	public String getEmail() {
		return email;
	}

	@Override
	public String toString() {
		return name + ' ' + tin + ' ' + email;
	}

	@Override
	public boolean equals(Object obj) {
		if (obj != null && obj instanceof Company) {
			final Company company = (Company) obj;
			return equals(name, company.getName()) &&
					equals(tin, company.getTin()) &&
					equals(email, company.getEmail());
		}
		return super.equals(obj);
	}

	private static boolean equals(Object obj0, Object obj1) {
		if (obj0 == null)
			return obj1 == null;
		return obj0.equals(obj1);
	}
}
