package io.kaif.web.support;

import java.beans.PropertyEditorSupport;

import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.RestController;

import io.kaif.config.SwaggerConfiguration;
import io.kaif.flake.FlakeId;

/**
 * auto convert flakeId from string.
 * <p>
 * if you add more auto conversion for types, consider add it to {@link
 * SwaggerConfiguration#alternativeTypeRules()}
 */
@ControllerAdvice(annotations = { RestController.class, Controller.class })
public class WebDataBinderAdvice {
  public static class FlakeIdPropertyEditor extends PropertyEditorSupport {
    @Override
    public String getAsText() {
      FlakeId value = (FlakeId) getValue();
      return (value != null ? value.toString() : "");
    }

    @Override
    public void setAsText(String text) throws IllegalArgumentException {
      if (StringUtils.hasText(text)) {
        setValue(FlakeId.fromString(text));
      } else {
        setValue(null);
      }
    }
  }

  @InitBinder
  public void initBinder(WebDataBinder binder) {
    binder.registerCustomEditor(FlakeId.class, new WebDataBinderAdvice.FlakeIdPropertyEditor());
  }
}