package com.bb.model;

import com.bb.exception.ApiException;
import com.bb.exception.RequestParameterApiException;
import com.bb.util.StringUtils;
import com.fasterxml.jackson.annotation.JsonInclude;


import lombok.Data;
import lombok.Getter;
import lombok.Setter;

import java.util.HashMap;
import java.util.Map;


@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
public class EvoResponse {
    /** 결과 코드 */
    private String status;
    private String sid;
    private Double balance;
    private Double bonus;
    private String uuid;
    
    private boolean retransmission;

    /** 데이터 */
    private Map<String, Object> data;

    /**
     * 데이터 추가
     * @param key
     * @param value
     */
    public void put(String key, Object value) {
        if(this.data == null) {
            this.data = new HashMap<>();
        }

        this.data.put(key, value);
    }

    /**
     * 성공상태 설정
     */
    public void success() {
        this.setStatus("OK");
        this.retransmission =false;
    }

    /**
     * 실패상태 설정
     */
    public void fail() {
    	   this.setStatus("INVALID_PARAMETER");
    	   this.retransmission =true;
    }
    
    /**
     * 실패상태 설정
     */
    public void fail(String msg) {
    	   this.setStatus(msg);
    	   this.retransmission =false;
    }

    /**
     * 필수 파라미터 검증
     * @param value
     * @param paramName
     * @throws ApiException
     */
    public static void require(Object value, String paramName) throws ApiException {
        String stringValue = (value == null) ? null : String.valueOf(value);

        if(StringUtils.isEmpty(stringValue)) {
            throw new RequestParameterApiException( paramName);
        }
    }

    /**
     * 파라미터 조건 검증
     * @param condition
     * @param message
     * @throws ApiException
     */
    public static void then( boolean condition, String message ) throws ApiException {
        if( condition ) {
            throw new ApiException( message );
        }
    }

    /**
     * 파라미터가 특정 목록에 포함되어 있는지 검증
     * @param param
     * @param paramName
     * @param values
     * @throws ApiException
     */
    public static void notMatched( Object param, String paramName, Object... values ) throws ApiException {
        boolean matched = false;

        for( Object value : values ) {
            if( param.equals( value ) ) {
                matched = true;
                break;
            }
        }

        if( !matched ) {
            throw new ApiException( "유효하지 않은 파라미터 : " + paramName );
        }
    }

}
