package jp.kobe_u.cs27.newse.medicalcheck.dto;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.validation.constraints.Digits;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Pattern;

import jp.kobe_u.cs27.newse.medicalcheck.entity.Person;
import jp.kobe_u.cs27.newse.medicalcheck.exception.MedicalCheckException;
import lombok.Data;

/**
 * 健康診断受診者のデータ受付フォーム
 */
@Data
public class PersonForm {

    /* 名前は無記名は許さない */
    @NotBlank
    private String name;

    /* 誕生日はyyyy-mm-ddの形式 */
    @Pattern(regexp = "\\d{4}-\\d{2}-\\d{2}")
    private String birthday;

    /* 身長は0以上．整数部3桁，小数部4桁以内 */
    @Min(0)
    @Digits(integer = 3, fraction = 4)
    private Double height; // 身長

    /* 体重は0以上．整数部3桁，小数部4桁以内 */
    @Min(0)
    @Digits(integer = 3, fraction = 4)
    private Double weight; // 体重

    /**
     * フォームをエンティティに変換
     * 
     * @return
     */
    public Person toEntity() {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd");
        Date bdate;
        try {
            bdate = sdf.parse(birthday);
        } catch (ParseException e) {
            throw new MedicalCheckException(MedicalCheckException.FORM_VALIDATION_FAILED, 
            "Invalid birthday :" + birthday);
        }

        return new Person(null, name, bdate, height, weight, new Date());

    }
}