package pwc.taxtech.atms.dto;

import java.util.Map;

public class OperationResultDto<T> extends OperationResultBase {

    public static final OperationResultDto<Boolean> SUCCESS_EMPTY = new OperationResultDto<>();

    static {
        SUCCESS_EMPTY.setResult(true);
        SUCCESS_EMPTY.setData(true);
        SUCCESS_EMPTY.setResultMsg("");
    }

    private Map<String, String> errors;

    private T data;

    public OperationResultDto() {
    }

    public OperationResultDto(Boolean result) {
        super();
        this.setResult(result);
    }

    public OperationResultDto(Boolean result, String resultMsg) {
        super();
        this.setResult(result);
        this.setResultMsg(resultMsg);
    }

    public OperationResultDto(Boolean result, String resultMsg, T data) {
        super();
        this.setResult(result);
        this.setResultMsg(resultMsg);
        this.setData(data);
    }


    public static OperationResultDto<?> success() {
        return new OperationResultDto<>(true);
    }

    public static OperationResultDto<?> success(Object data) {
        OperationResultDto dto = new OperationResultDto();
        dto.setData(data);
        dto.setResult(true);
        return dto;
    }

    public static OperationResultDto<?> error() {
        return OperationResultDto.error(null);
    }

    public static OperationResultDto<?> error(String msg) {
        return new OperationResultDto<>(false, msg);
    }

    public Map<String, String> getErrors() {
        return errors;
    }

    public void setErrors(Map<String, String> errors) {
        this.errors = errors;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }

    public static OperationResultDto<Boolean> errorFor(String reason) {
        OperationResultDto<Boolean> resultDto = new OperationResultDto<>();
        resultDto.setResult(false);
        resultDto.setData(false);
        resultDto.setResultMsg(reason);
        return resultDto;
    }

}