package gui;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.image.BufferedImage;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JToolBar;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

import model.Entity;
import repository.Project;

public abstract class Editable extends JPanel implements ListSelectionListener {
	
	protected ListGUI listGUI;
	protected Entity entity;
	protected String selectedEntityName;
	protected BufferedImage image;
	EditableCanvas canvas;
	JToolBar toolbar = new JToolBar("Toolbar",JToolBar.VERTICAL);
	JButton clearLinesJButton;
	
	private static Logger logger = Logger.getLogger("gui.Editable");
	
	
	Editable(ListGUI listGUI){
		this.listGUI = listGUI;
		setLayout(new BorderLayout());

		clearLinesJButton = createButton("Clear lines",null,"res/destroy.png");
		clearLinesJButton.addActionListener((e)->{
			canvas.renderingFunction.functionClearJButton();
			canvas.repaint();
		});
		toolbar.setBorder(BorderFactory.createLoweredBevelBorder());
		toolbar.addSeparator();
		toolbar.add(clearLinesJButton);
		this.add(toolbar,BorderLayout.EAST);
		toolbar.setPreferredSize(new Dimension(40,40));
		// РАСКОММЕНТИТЬ ЕСЛИ НУЖНО ВЫВОДИТЬ ПОДРОБНЫЕ ЛОГИ
		logger.setLevel(Level.ALL);
	}
	


    public String getName() {
		return selectedEntityName;
	}
	
	public void setName(String name) {
		this.selectedEntityName = name;
	}
	
	public void setEntityByName(String name) throws Exception {
		entity = Project.getInstance().getEntityByName(name);
	}


	
    @Override
    public void valueChanged(ListSelectionEvent e) {
		logger.log(Level.FINEST, "entering method {0} of class {1}", new Object[]{"MouseClicked()" , this.getClass().getName()});
    	//logger.entering(this.getClass().getName(), "MouseClicked()");
    	if(e.getSource() instanceof JList) {
    		//TODO: надо бы элегантнее пробросить сюда ListGUI - просто передача его в аргументах немножко громоздкая
    		// как-то обыграть это через события? 
    		// ps. попытки обратиться к eventSource проваливаются - ListGUI это панель, уже внутри которой лежит JList
    		selectedEntityName = listGUI.getSelectedName();
    		try {
				entity = Project.getInstance().getEntityByName(selectedEntityName);
			} catch (Exception e1) {
				logger.severe("Entity with name '"+selectedEntityName+"' was not found! Cannot display it on panel!");
			}
    		image = Project.getInstance().loadImageByName(selectedEntityName);
    		//TODO: if(image == null) вызов FileChooser'a и выбор изображения
    		canvas.setEntity(entity);
    		canvas.setImage(image);
    		canvas.repaint();
//    		System.out.println(" Canvas image = " + canvas.image);
//			System.out.println(" Canvas entity = " + canvas.entity);
//    		System.out.println(" Editable image = " + image);
//			System.out.println(" Editable entity = " + entity);
    	}
    }
    
    JButton createButton(String text,ActionListener listener,String pathImage) {
		JButton button = new JButton(new ImageIcon(pathImage));
		button.addActionListener(listener); 
		button.setContentAreaFilled(false);
		button.setFocusPainted(false);
		button.setPreferredSize(new Dimension(20, 20));
		return button;
	}
    
}
