package net.vulkanmod.config.gui.widget;

import net.minecraft.class_1109;
import net.minecraft.class_1144;
import net.minecraft.class_11909;
import net.minecraft.class_2561;
import net.minecraft.class_310;
import net.minecraft.class_327;
import net.minecraft.class_3417;
import net.minecraft.class_6379;
import net.minecraft.class_6382;
import net.minecraft.class_6379.class_6380;
import net.vulkanmod.config.gui.render.GuiRenderer;
import net.vulkanmod.config.option.Option;
import net.vulkanmod.vulkan.util.ColorUtil;

public abstract class OptionWidget<O extends Option<?>> extends VAbstractWidget implements class_6379 {
   public int controlX;
   public int controlWidth;
   private final class_2561 name;
   protected class_2561 displayedValue;
   protected boolean controlHovered;
   final O option;

   public OptionWidget(O option, class_2561 name) {
      this.option = option;
      this.name = name;
      this.displayedValue = class_2561.method_43470("N/A");
   }

   public void setDimensions(int x, int y, int width, int height) {
      super.setDimensions(x, y, width, height);
      this.controlWidth = Math.min((int)((float)width * 0.5F) - 8, 120);
      this.controlX = this.x + this.width - this.controlWidth - 8;
   }

   public void render(double mouseX, double mouseY) {
      if (this.visible) {
         this.updateDisplayedValue();
         this.controlHovered = mouseX >= (double)this.controlX && mouseY >= (double)this.y && mouseX < (double)(this.controlX + this.controlWidth) && mouseY < (double)(this.y + this.height);
         this.renderWidget(mouseX, mouseY);
      }
   }

   public void updateState() {
   }

   public void renderWidget(double mouseX, double mouseY) {
      class_310 minecraftClient = class_310.method_1551();
      int i = this.getYImage(this.isHovered());
      int xPadding = 0;
      int yPadding = 0;
      int color = ColorUtil.ARGB.pack(0.0F, 0.0F, 0.0F, 0.45F);
      GuiRenderer.fill(this.x - xPadding, this.y - yPadding, this.x + this.width + xPadding, this.y + this.height + yPadding, color);
      this.renderHovering(0, 0);
      color = this.active ? -1 : -6250336;
      class_327 textRenderer = minecraftClient.field_1772;
      GuiRenderer.drawString(textRenderer, this.getName().method_30937(), this.x + 8, this.y + (this.height - 8) / 2, color);
      this.renderControls(mouseX, mouseY);
   }

   protected int getYImage(boolean hovered) {
      int i = 1;
      if (!this.active) {
         i = 0;
      } else if (hovered) {
         i = 2;
      }

      return i;
   }

   public boolean isHovered() {
      return this.hovered || this.focused;
   }

   protected abstract void renderControls(double var1, double var3);

   public abstract void onClick(double var1, double var3);

   public abstract void onRelease(double var1, double var3);

   protected abstract void onDrag(double var1, double var3, double var5, double var7);

   protected boolean isValidClickButton(int button) {
      return button == 0;
   }

   public boolean method_25403(class_11909 event, double deltaX, double deltaY) {
      if (this.isValidClickButton(event.method_74245())) {
         this.onDrag(event.comp_4798(), event.comp_4799(), deltaX, deltaY);
         return true;
      } else {
         return false;
      }
   }

   public boolean method_25402(class_11909 event, boolean bl) {
      if (this.active && this.visible) {
         if (this.isValidClickButton(event.method_74245()) && this.clicked(event.comp_4798(), event.comp_4799())) {
            this.playDownSound(class_310.method_1551().method_1483());
            this.onClick(event.comp_4798(), event.comp_4799());
            return true;
         } else {
            return false;
         }
      } else {
         return false;
      }
   }

   public boolean method_25406(class_11909 event) {
      if (this.isValidClickButton(event.method_74245())) {
         this.onRelease(event.comp_4798(), event.comp_4799());
         return true;
      } else {
         return false;
      }
   }

   public boolean method_25405(double mouseX, double mouseY) {
      return this.active && this.visible && mouseX >= (double)this.x && mouseY >= (double)this.y && mouseX < (double)(this.x + this.width) && mouseY < (double)(this.y + this.height);
   }

   public void method_25365(boolean bl) {
      this.focused = bl;
   }

   public boolean method_25370() {
      return this.focused;
   }

   protected boolean clicked(double mouseX, double mouseY) {
      return this.active && this.visible && mouseX >= (double)this.controlX && mouseY >= (double)this.y && mouseX < (double)(this.x + this.width) && mouseY < (double)(this.y + this.height);
   }

   public class_2561 getName() {
      return this.name;
   }

   public class_2561 getDisplayedValue() {
      return this.displayedValue;
   }

   protected void updateDisplayedValue() {
      this.displayedValue = this.option.getDisplayedValue();
   }

   public class_2561 getTooltip() {
      return this.option.getTooltip();
   }

   public class_6379.class_6380 method_37018() {
      if (this.focused) {
         return class_6380.field_33786;
      } else {
         return this.hovered ? class_6380.field_33785 : class_6380.field_33784;
      }
   }

   public final void method_37020(class_6382 narrationElementOutput) {
   }

   public void playDownSound(class_1144 soundManager) {
      soundManager.method_4873(class_1109.method_47978(class_3417.field_15015, 1.0F));
   }
}
