package xdman.ui.components;

import static xdman.util.XDMUtils.getScaledInt;

import java.awt.Color;
import java.awt.GraphicsDevice.WindowTranslucency;
import java.awt.GraphicsEnvironment;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.ArrayList;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.border.EmptyBorder;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.text.Document;

import xdman.Config;
import xdman.DownloadQueue;
import xdman.XDMApp;
import xdman.downloaders.metadata.DashMetadata;
import xdman.downloaders.metadata.HttpMetadata;
import xdman.mediaconversion.MediaFormat;
import xdman.mediaconversion.MediaFormats;
import xdman.ui.res.ColorResource;
import xdman.ui.res.FontResource;
import xdman.ui.res.ImageResource;
import xdman.ui.res.StringResource;
import xdman.util.Logger;
import xdman.util.XDMUtils;

public class VideoDownloadWindow extends JDialog implements ActionListener, DocumentListener {

	private static final long serialVersionUID = 416356191545932172L;
	private XDMFileSelectionPanel filePane;// private JTextField txtFile;
	private JPopupMenu pop;
	private CustomButton btnMore, btnDN, btnCN;
	private HttpMetadata metadata;
	// private String folder;
	private String queueId;
	// private JComboBox<String> cmbStmAction;
	private JComboBox<MediaFormat> cmbOutFormat;
	private String originalExt;
	// private DefaultComboBoxModel<MediaFormat> formatListModel;
	private boolean dashAudioOnly;

	public VideoDownloadWindow(HttpMetadata metadata, String file) {
		// this.folder = Config.getInstance().getDownloadFolder();
		this.metadata = metadata;
		if (this.metadata == null) {
			this.metadata = new HttpMetadata();
		}

		initUI();

		if (file != null && file.length() > 0) {
			filePane.setFileName(file);
			// txtFile.setCaretPosition(0);
			originalExt = XDMUtils.getExtension(filePane.getFileName());
		}

		getRootPane().setDefaultButton(btnDN);

		addWindowListener(new WindowAdapter() {
			@Override
			public void windowActivated(WindowEvent e) {
				filePane.setFocus();
			}
		});

		queueId = "";
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		if (e.getSource() instanceof JComponent) {
			String name = ((JComponent) e.getSource()).getName();
			if (name.startsWith("QUEUE")) {
				System.out.println(name);
				String[] arr = name.split(":");
				if (arr.length < 2) {
					queueId = "";
				} else {
					queueId = arr[1].trim();
				}
				createDownload(false);
			} else if (name.equals("FORMAT_SELECT")) {
				updateFileExtension();
			} else if (name.equals("CLOSE")) {
				dispose();
			} else if (name.equals("DOWNLOAD_NOW")) {
				queueId = "";
				createDownload(true);
			} else if (name.equals("BTN_MORE")) {
				if (pop == null) {
					createPopup();
				}
				pop.show(btnMore, 0, btnMore.getHeight());
			} 
//			
//			else if (name.equals("BROWSE_FOLDER")) {
//				choseFolder();
//			}
		}
	}

	private void createDownload(boolean now) {
		String fileName = filePane.getFileName();
		if (fileName.length() < 1) {
			JOptionPane.showMessageDialog(this, StringResource.get("MSG_NO_URL"));
			return;
		}
		// if (!XDMUtils.validateURL(urlStr)) {
		// urlStr = "http://" + urlStr;
		// if (!XDMUtils.validateURL(urlStr)) {
		// JOptionPane.showMessageDialog(this,
		// StringResource.get("MSG_INVALID_URL"));
		// return;
		// } else {
		// txtURL.setText(urlStr);
		// }
		// }
		// if (!urlStr.equals(metadata.getUrl())) {
		// metadata.setUrl(urlStr);
		// }
		dispose();
		Logger.log("file: " + filePane.getFileName());
		if (filePane.getFileName().length() < 1) {
			JOptionPane.showMessageDialog(this, StringResource.get("MSG_NO_FILE"));
			return;
		}

		String file = XDMUtils.createSafeFileName(filePane.getFileName());
		if (metadata instanceof DashMetadata) {
			MediaFormat fmt = (MediaFormat) cmbOutFormat.getSelectedItem();
			if (fmt != null) {
				if (fmt.isAudioOnly()) {
					dashAudioOnly = true;
				}
			}
		}

		int fmtIndex = cmbOutFormat.getSelectedIndex();
		if (fmtIndex < 0) {
			fmtIndex = 0;
		}

		XDMApp.getInstance().createDownload(file, filePane.getFolder(), metadata, now, queueId, fmtIndex,
				dashAudioOnly ? 1 : 0);
	}

	// private void choseFolder() {
	// JFileChooser jfc =
	// XDMFileChooser.getFileChooser(JFileChooser.DIRECTORIES_ONLY,
	// new File(folder == null ? Config.getInstance().getDownloadFolder() :
	// folder));
	// if (jfc.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {
	// folder = jfc.getSelectedFile().getAbsolutePath();
	// // Config.getInstance().setDownloadFolder(folder);
	// }
	// }

	@Override
	public void changedUpdate(DocumentEvent e) {
		update(e);
	}

	@Override
	public void insertUpdate(DocumentEvent e) {
		update(e);
	}

	@Override
	public void removeUpdate(DocumentEvent e) {
		update(e);
	}

	void update(DocumentEvent e) {
		try {
			Document doc = e.getDocument();
			int len = doc.getLength();
			String text = doc.getText(0, len);
			filePane.setFileName(XDMUtils.getFileName(text));
		} catch (Exception err) {
			Logger.log(err);
		}
	}

	private void initUI() {
		setUndecorated(true);

		try {
			if (GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice()
					.isWindowTranslucencySupported(WindowTranslucency.TRANSLUCENT)) {
				if (!Config.getInstance().isNoTransparency()) {
					setOpacity(0.85f);
				}
			}
		} catch (Exception e) {
			Logger.log(e);
		}

		setIconImage(ImageResource.getImage("icon.png"));
		setSize(getScaledInt(400), getScaledInt(210));
		setLocationRelativeTo(null);
		setAlwaysOnTop(true);
		getContentPane().setLayout(null);
		getContentPane().setBackground(ColorResource.getDarkestBgColor());

		JPanel titlePanel = new TitlePanel(null, this);
		titlePanel.setOpaque(false);
		titlePanel.setBounds(0, 0, getScaledInt(400), getScaledInt(50));

		JButton closeBtn = new CustomButton();
		closeBtn.setBounds(getScaledInt(365), getScaledInt(5), getScaledInt(30), getScaledInt(30));
		closeBtn.setBackground(ColorResource.getDarkestBgColor());
		closeBtn.setBorderPainted(false);
		closeBtn.setFocusPainted(false);
		closeBtn.setName("CLOSE");

		closeBtn.setIcon(ImageResource.getIcon("title_close.png",20,20));
		closeBtn.addActionListener(this);
		titlePanel.add(closeBtn);

		JLabel titleLbl = new JLabel(StringResource.get("VID_TITLE"));
		titleLbl.setFont(FontResource.getBiggerFont());
		titleLbl.setForeground(ColorResource.getSelectionColor());
		titleLbl.setBounds(getScaledInt(25), getScaledInt(15), getScaledInt(200), getScaledInt(30));
		titlePanel.add(titleLbl);

		JLabel lineLbl = new JLabel();
		lineLbl.setBackground(ColorResource.getSelectionColor());
		lineLbl.setBounds(0, getScaledInt(55), getScaledInt(400), 1);
		lineLbl.setOpaque(true);
		add(lineLbl);

		filePane = new XDMFileSelectionPanel();
		filePane.setBounds(getScaledInt(90), getScaledInt(79), getScaledInt(277), getScaledInt(20));
		add(filePane);

		// txtFile = new JTextField();
		// txtFile.setBorder(new LineBorder(ColorResource.getSelectionColor(), 1));
		// txtFile.setBackground(ColorResource.getDarkestBgColor());
		// txtFile.setForeground(Color.WHITE);
		// txtFile.setBounds(getScaledInt(90), getScaledInt(79), getScaledInt(230),
		// getScaledInt(20));
		// txtFile.setCaretColor(ColorResource.getSelectionColor());
		//
		// add(txtFile);
		//
		// JButton browse = new CustomButton("...");
		// browse.setName("BROWSE_FOLDER");
		// browse.setMargin(new Insets(0, 0, 0, 0));
		// browse.setBounds(getScaledInt(325), getScaledInt(79), getScaledInt(40),
		// getScaledInt(20));
		// browse.setFocusPainted(false);
		// browse.setBackground(ColorResource.getDarkestBgColor());
		// browse.setBorder(new LineBorder(ColorResource.getSelectionColor(), 1));
		// browse.setForeground(Color.WHITE);
		// browse.addActionListener(this);
		// browse.setFont(FontResource.getItemFont());
		// add(browse);

		add(titlePanel);

		JLabel lblFile = new JLabel(StringResource.get("ND_FILE"), JLabel.RIGHT);
		lblFile.setFont(FontResource.getNormalFont());
		lblFile.setForeground(Color.WHITE);
		lblFile.setBounds(getScaledInt(10), getScaledInt(79), getScaledInt(75), getScaledInt(23));
		add(lblFile);

		JLabel lblFmt = new JLabel(StringResource.get("LBL_CONVERT_TO"), JLabel.RIGHT);
		lblFmt.setFont(FontResource.getNormalFont());
		lblFmt.setForeground(Color.WHITE);
		lblFmt.setBounds(getScaledInt(10), getScaledInt(111), getScaledInt(75), getScaledInt(23));
		add(lblFmt);

		cmbOutFormat = new JComboBox<MediaFormat>(MediaFormats.getSupportedFormats());
		cmbOutFormat.addActionListener(this);
		cmbOutFormat.setOpaque(true);
		cmbOutFormat.setBounds(getScaledInt(90), getScaledInt(111), getScaledInt(277), getScaledInt(20));
		// cmbStmAction.setRenderer(new SimpleListRenderer());
		cmbOutFormat.setName("FORMAT_SELECT");
		add(cmbOutFormat);
		// JLabel lblStream = new JLabel(StringResource.get("O_STM_FTM"), JLabel.RIGHT);
		// lblStream.setFont(FontResource.getNormalFont());
		// lblStream.setForeground(Color.WHITE);
		// lblStream.setBounds(10, 111, 61, 20);
		// add(lblStream);

		// cmbStmAction = new JComboBox<String>(new String[] {
		// StringResource.get("VID_FMT_BOTH"),
		// StringResource.get("VID_FMT_AUDIO"), StringResource.get("VID_FMT_VIDEO") });
		// // cmbStmAction.setBackground(ColorResource.getDarkerBgColor());
		// cmbStmAction.addActionListener(this);
		// cmbStmAction.setOpaque(true);
		// cmbStmAction.setBounds(77, 111, 291, 20);
		// // cmbStmAction.setRenderer(new SimpleListRenderer());
		// cmbStmAction.setName("STREAM");
		// add(cmbStmAction);

		// txtFile = new JTextField();
		// txtFile.setBorder(new LineBorder(ColorResource.getSelectionColor(),
		// 1));
		// txtFile.setBackground(ColorResource.getDarkestBgColor());
		// txtFile.setForeground(Color.WHITE);
		// txtFile.setBounds(77, 111, 241, 20);
		// txtFile.setCaretColor(ColorResource.getSelectionColor());
		//
		// add(txtFile);

		JPanel panel = new JPanel(null);
		panel.setBounds(0, getScaledInt(155), getScaledInt(400), getScaledInt(55));
		panel.setBackground(Color.DARK_GRAY);
		add(panel);

		btnMore = new CustomButton(StringResource.get("ND_MORE"));
		btnDN = new CustomButton(StringResource.get("ND_DOWNLOAD_NOW"));
		btnCN = new CustomButton(StringResource.get("ND_CANCEL"));

		btnMore.setBounds(0, 1, getScaledInt(120), getScaledInt(55));
		btnMore.setName("BTN_MORE");
		styleButton(btnMore);
		panel.add(btnMore);

		btnDN.setBounds(getScaledInt(121), 1, getScaledInt(160), getScaledInt(55));
		btnDN.setName("DOWNLOAD_NOW");
		styleButton(btnDN);
		panel.add(btnDN);

		btnCN.setBounds(getScaledInt(282), 1, getScaledInt(120), getScaledInt(55));
		btnCN.setName("CLOSE");
		styleButton(btnCN);
		panel.add(btnCN);

		Logger.log("Dash metadata? " + (metadata instanceof DashMetadata));
		// cmbStmAction.setEnabled(metadata != null && metadata instanceof
		// DashMetadata);

		cmbOutFormat.setEnabled(XDMUtils.isFFmpegInstalled());

	}

	private void createPopup() {
		pop = new JPopupMenu();
		pop.setBackground(ColorResource.getDarkerBgColor());
		JMenu dl = new JMenu(StringResource.get("ND_DOWNLOAD_LATER"));
		dl.setForeground(Color.WHITE);
		dl.setBorder(new EmptyBorder(getScaledInt(5), getScaledInt(5), getScaledInt(5), getScaledInt(5)));
		dl.addActionListener(this);
		dl.setBackground(ColorResource.getDarkerBgColor());
		dl.setBorderPainted(false);
		// dl.setBackground(C);
		pop.add(dl);

		createQueueItems(dl);

		JMenuItem ig = new JMenuItem(StringResource.get("ND_IGNORE_URL"));
		ig.setName("IGNORE_URL");
		ig.setForeground(Color.WHITE);
		ig.addActionListener(this);
		pop.add(ig);
		pop.setInvoker(btnMore);
	}

	private void styleButton(CustomButton btn) {
		btn.setBackground(ColorResource.getDarkestBgColor());
		btn.setPressedBackground(ColorResource.getDarkerBgColor());
		btn.setForeground(Color.WHITE);
		btn.setFont(FontResource.getBigFont());
		btn.setBorderPainted(false);
		btn.setMargin(new Insets(0, 0, 0, 0));
		btn.setFocusPainted(false);
		btn.addActionListener(this);
	}

	private void createQueueItems(JMenuItem queueMenuItem) {
		ArrayList<DownloadQueue> queues = XDMApp.getInstance().getQueueList();
		for (int i = 0; i < queues.size(); i++) {
			DownloadQueue q = queues.get(i);
			JMenuItem mItem = new JMenuItem(q.getName().length() < 1 ? "Default queue" : q.getName());
			mItem.setName("QUEUE:" + q.getQueueId());
			mItem.setForeground(Color.WHITE);
			mItem.addActionListener(this);
			queueMenuItem.add(mItem);
		}
	}

	// private void updateAppliableFormats() {
	// int index = cmbStmAction.getSelectedIndex();
	// if (index < 0)
	// return;
	// MediaFormat[] fmts = MediaFormats.getSupportedFormats();
	// formatListModel.removeAllElements();
	// for (MediaFormat fmt : fmts) {
	// if (index == 1) {
	// if (fmt.isAudioOnly()) {
	// formatListModel.addElement(fmt);
	// }
	// } else if (index == 2) {
	// if (!fmt.isAudioOnly() && fmt.getWidth() > 0) {// skip default
	// formatListModel.addElement(fmt);
	// }
	// } else {
	// formatListModel.addElement(fmt);
	// }
	// }
	// }

	// private int getFormatIndex(int relativeIndex) {
	// if (relativeIndex < 0)
	// return 0;
	// MediaFormat format = formatListModel.getElementAt(relativeIndex);
	// int index = 0;
	// for (MediaFormat fmt : MediaFormats.getSupportedFormats()) {
	// if (format == fmt) {
	// Logger.log("Format index: " + index);
	// return index;
	// }
	// index++;
	// }
	// return 0;
	// }

	private void updateFileExtension() {
		String file = XDMUtils.getFileNameWithoutExtension(filePane.getFileName());
		if (cmbOutFormat.getSelectedIndex() < 1) {
			filePane.setFileName(file + originalExt);
		} else {
			String ext = ((MediaFormat) cmbOutFormat.getSelectedItem()).getFormat();
			filePane.setFileName(file + "." + ext);
		}
	}
}