package xdman.ui.laf;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Insets;
import java.awt.Rectangle;

import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JScrollBar;
import javax.swing.SwingConstants;
import javax.swing.plaf.ComponentUI;
import javax.swing.plaf.basic.BasicScrollBarUI;

import xdman.ui.components.CustomButton;
import xdman.ui.components.DarkScrollBar;
import xdman.ui.res.ImageResource;
import xdman.util.XDMUtils;

public class XDMScrollBarUI extends BasicScrollBarUI {

	public static ComponentUI createUI(JComponent c) {
		return new XDMScrollBarUI();
	}

	Color roColor1, roColor2;

	Color barColor1, barColor2;

	Color trackColor1, trackColor2;

	boolean darkMode = false;

	// Color borderColor = new Color(170, 170, 170);

	public XDMScrollBarUI() {
		// borderColor = new Color(185, 185, 185);
		roColor1 = new Color(170, 170, 170);
		barColor1 = new Color(215, 215, 215);
		trackColor1 = new Color(240, 240, 240);

		roColor2 = new Color(160, 160, 160);
		barColor2 = new Color(130, 130, 130);
		trackColor2 = new Color(70, 70, 70);
	}

	@Override
	public void installUI(JComponent c) {
		super.installUI(c);

		darkMode = scrollbar instanceof DarkScrollBar;
		if ((scrollbar.getOrientation() == JScrollBar.HORIZONTAL)) {
			c.setPreferredSize(new Dimension(XDMUtils.getScaledInt(15),
					darkMode ? XDMUtils.getScaledInt(8) : XDMUtils.getScaledInt(15)));
		} else {
			c.setPreferredSize(new Dimension(darkMode ? XDMUtils.getScaledInt(8) : XDMUtils.getScaledInt(15),
					XDMUtils.getScaledInt(15)));
		}
	}

	protected void paintThumb(Graphics g, JComponent c, Rectangle thumbBounds) {
		if (thumbBounds.isEmpty() || !scrollbar.isEnabled()) {
			return;
		}

		int w = thumbBounds.width;
		int h = thumbBounds.height;

		g.translate(thumbBounds.x, thumbBounds.y);

		Graphics2D g2 = (Graphics2D) g;

		if (isThumbRollover()) {
			g2.setColor(darkMode ? roColor2 : roColor1);
		} else {
			g2.setColor(darkMode ? barColor2 : barColor1);
		}

		// g.fillRect(1, 0, w - 3, h - 1);
		g.fillRect(0, 0, w, h);

		// g2.setColor(borderColor);
		// g.drawRect(1, 0, w - 3, h - 1);
		g.translate(-thumbBounds.x, -thumbBounds.y);
	}

	@Override
	protected void paintTrack(Graphics g, JComponent c, Rectangle r) {
		g.setColor(darkMode ? trackColor2 : trackColor1);
		g.translate(r.x, r.y);
		g.fillRect(0, 0, r.width, r.height);
		g.translate(-r.x, -r.y);
		// super.paintTrack(g, c, r);
	}

	protected JButton createDecreaseButton(int orientation) {
		return createScrollButton(orientation);
	}

	protected JButton createIncreaseButton(int orientation) {
		return createScrollButton(orientation);
	}

	protected JButton createZeroButton() {
		JButton button = new JButton();
		Dimension zeroDim = new Dimension(0, 0);
		button.setPreferredSize(zeroDim);
		button.setMinimumSize(zeroDim);
		button.setMaximumSize(zeroDim);
		return button;
	}

	private JButton createScrollButton(int orientation) {
		darkMode = scrollbar instanceof DarkScrollBar;

		if (darkMode) {
			return createZeroButton();
		}

		CustomButton btn = new CustomButton();
		btn.setBackground(darkMode ? trackColor2 : trackColor1);
		btn.setContentAreaFilled(false);
		btn.setHorizontalAlignment(JButton.CENTER);
		btn.setMargin(new Insets(0, 0, 0, 0));
		btn.setBorderPainted(false);
		if (orientation == SwingConstants.NORTH) {
			btn.setIcon(ImageResource.getIcon("up.png", 10, 10));
			btn.setPreferredSize(new Dimension(XDMUtils.getScaledInt(15), XDMUtils.getScaledInt(18)));
		}
		if (orientation == SwingConstants.SOUTH) {
			btn.setIcon(ImageResource.getIcon("down.png", 10, 10));
			btn.setPreferredSize(new Dimension(XDMUtils.getScaledInt(15), XDMUtils.getScaledInt(18)));
		}
		if (orientation == SwingConstants.EAST) {
			btn.setIcon(ImageResource.getIcon("right.png", 10, 10));
			btn.setPreferredSize(new Dimension(XDMUtils.getScaledInt(18), XDMUtils.getScaledInt(15)));
		}
		if (orientation == SwingConstants.WEST) {
			btn.setIcon(ImageResource.getIcon("left.png", 10, 10));
			btn.setPreferredSize(new Dimension(XDMUtils.getScaledInt(18), XDMUtils.getScaledInt(15)));
		}
		return btn;
	}
}