package com.matt.forgehax.asm.utils.asmtype.builders;

import com.matt.forgehax.asm.ASMCommon;
import com.matt.forgehax.asm.utils.asmtype.ASMClass;
import com.matt.forgehax.asm.utils.name.NameBuilder;
import java.util.Objects;
import joptsimple.internal.Strings;
import org.objectweb.asm.Type;

/**
 * Created on 5/27/2017 by fr1kin
 */
public class ASMClassBuilder implements ASMCommon {
  
  private Type name = null, srgName = null, obfuscatedName = null;
  
  private boolean auto = false;
  
  protected ASMClassBuilder() {
  }
  
  public ASMClassBuilder setClassName(Type type) {
    name = type;
    return this;
  }
  
  public ASMClassBuilder setClassName(String internalClassName) {
    return setClassName(
      !Strings.isNullOrEmpty(internalClassName) ? Type.getObjectType(internalClassName) : null);
  }
  
  public ASMClassBuilder setClassName(Class<?> clazz) {
    return setClassName(Type.getType(clazz));
  }
  
  public ASMClassBuilder setSrgClassName(String srgInternalClassName) {
    srgName =
      !Strings.isNullOrEmpty(srgInternalClassName)
        ? Type.getObjectType(srgInternalClassName)
        : null;
    return this;
  }
  
  public ASMClassBuilder setObfuscatedClassName(String obfuscatedInternalClassName) {
    obfuscatedName =
      !Strings.isNullOrEmpty(obfuscatedInternalClassName)
        ? Type.getObjectType(obfuscatedInternalClassName)
        : null;
    return this;
  }
  
  public ASMClassBuilder autoAssign() {
    auto = true;
    return this;
  }
  
  private void attemptAutoAssign() {
    // srg name = mcp name (normal state) so no need to set it
    setObfuscatedClassName(MAPPER.getObfClassName(name.getInternalName()));
  }
  
  public ASMClass build() {
    Objects.requireNonNull(name, "Class name is missing");
    if (auto) {
      attemptAutoAssign();
    }
    return new ASMClass(NameBuilder.create(name, srgName, obfuscatedName));
  }
}