package com.intellij.tasks.generic;

import com.intellij.util.xmlb.annotations.Attribute;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;

/**
 * Editable variable which name can be used as placeholder and auto completed in EditorFields of
 * {@link GenericRepositoryEditor}. Variables is editable via {@link ManageTemplateVariablesDialog},
 * but if {@code shownOnFirstTab} property was set, it will also be shown on "General" tab among
 * standard fields like "Server URL", "Username" and "Password".
 *
 * @see GenericRepositoryEditor
 * @see ManageTemplateVariablesDialog
 *
 * @author evgeny.zakrevsky
 * @author Mikhail Golubev
 */
public class TemplateVariable {
  private String myName;
  private String myValue = "";
  private String myDescription = "";
  private boolean myReadOnly;
  private boolean myHidden;
  private boolean myShownOnFirstTab;

  public TemplateVariable(@NotNull @NonNls String name, @NotNull @NonNls String value) {
    myName = name;
    myValue = String.valueOf(value);
    myReadOnly = false;
    myDescription = "";
  }

  /**
   * Serialization constructor
   */
  @SuppressWarnings("unusedDesclaration")
  public TemplateVariable() {
    // empty
  }

  /**
   * Cloning constructor
   */
  private TemplateVariable(TemplateVariable other) {
    myName = other.getName();
    myValue = other.getValue();
    myDescription = other.getDescription();
    myHidden = other.isHidden();
    myReadOnly = other.isReadOnly();
    myShownOnFirstTab = other.isShownOnFirstTab();
  }

  public void setName(@NotNull @NonNls String name) {
    myName = name;
  }

  public void setValue(@NotNull @NonNls String value) {
    myValue = value;
  }

  @NotNull
  public String getName() {
    return myName;
  }

  @NotNull
  public String getValue() {
    return myValue;
  }

  // TODO: actually not used in UI
  @NotNull
  public String getDescription() {
    return myDescription;
  }

  public void setDescription(@NotNull @NonNls String description) {
    myDescription = description;
  }

  @Attribute("readOnly")
  public boolean isReadOnly() {
    return myReadOnly;
  }

  public void setReadOnly(boolean readOnly) {
    myReadOnly = readOnly;
  }

  @Attribute("hidden")
  public boolean isHidden() {
    return myHidden;
  }

  public void setHidden(boolean hidden) {
    myHidden = hidden;
  }

  @Attribute("shownOnFirstTab")
  public boolean isShownOnFirstTab() {
    return myShownOnFirstTab;
  }

  public void setShownOnFirstTab(boolean shownOnFirstTab) {
    myShownOnFirstTab = shownOnFirstTab;
  }

  public TemplateVariable clone() {
    return new TemplateVariable(this);
  }

  @Override
  public String toString() {
    return String.format("TemplateVariable(name='%s', value='%s')", getName(), getValue());
  }

  /**
   * Represents predefined template variable such as "serverUrl", "login" or "password" which are not
   * set explicitly by user but instead taken from repository itself.
   *
   * @see GenericRepository
   */
  public abstract static class FactoryVariable extends TemplateVariable {

    protected FactoryVariable(@NotNull @NonNls String name) {
      this(name, false);
    }

    public FactoryVariable(@NotNull @NonNls String name, boolean hidden) {
      super(name, "");
      setHidden(hidden);
    }


    @NotNull
    @Override
    public abstract String getValue();

    @Override
    public final void setName(@NotNull String name) {
      throw new UnsupportedOperationException("Name of predefined variable can't be changed");
    }

    @Override
    public final void setValue(@NotNull String value) {
      throw new UnsupportedOperationException("Value of predefined variable can't be changed explicitly");
    }

    @Override
    public final void setShownOnFirstTab(boolean shownOnFirstTab) {
      throw new UnsupportedOperationException("This parameter can't be changed for predefined variable");
    }

    @Override
    public void setReadOnly(boolean readOnly) {
      throw new UnsupportedOperationException("This parameter can't be changed for predefined variable");
    }

    @Override
    public boolean isReadOnly() {
      return true;
    }
  }

}
