package surface;


import hu.swankey.ammo.common.yggdrasil.definition.Definition;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.Insets;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTabbedPane;
import javax.swing.JTextArea;

import surface.classeditor.ClassEditor;
import view.IClientUI;
import view.Refreshable;
import background.Controller;
import client_engine.ClientController;

public class ClientUI extends JFrame implements IClientUI, Refreshable {

	private static final String TAB_PLAY = "Play";
	private static final String TAB_EDIT = "Editors";
	private static final String TAB_CONSOLE = "Console";
	
	private static final String TAB_MAP_EDITOR = "Map Editor";
    private static final String TAB_SCREEN_EDITOR = "Screen Editor";
    private static final String TAB_CLASS_EDITOR = "Class Editor";
    private static final String TAB_YGGDRASIL_EDITOR = "Yggdrasil";
    
    private static final String INPUTDIALOG_TITLE = "Set parameter";
    
//    private static final String TITLE_ENTITY = "Entity:";

    //private static final int RESULTS_HEIGHT = 150;
    //private static final int COMMAND_BAR_INITIAL_WIDTH = 100;

	private static final long serialVersionUID = 1L;

	/** Controller */
    private final ClientController controller;
    
    /** Map */
    //private MapView map;


	//private final SelectorTree selectorEntity;

    private final JTextArea jtextarea_console = new JTextArea();
    private final JScrollPane jscroll_console = new JScrollPane( jtextarea_console );
    
    
    private ClientUI(Controller controller){
    	this.controller = controller;
    	
//    	map = MapView.create(controller);
//        selectorEntity = SelectorTree.create(TITLE_ENTITY, null, controller, false);
    }
    
//    private MapView getMap(){
//    	return map;
//    }
    
    
    public static ClientUI createClientUI(final Controller controller) {

    	ClientUI ui = new ClientUI(controller);
    	BorderLayout layout = new BorderLayout();
    	ui.setLayout(layout);
    	ui.setSize(800,600);
    	ui.setLocationRelativeTo(null);
    	ui.setTitle(controller.getClientType() + " " + controller.getClientVer());
    	ui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    	
    	
    	// Main tabs:
    	JTabbedPane mainTabs = new JTabbedPane();
    	ui.add(mainTabs);
    	    	
    	// Play tab:
        //CommandBar commandBar = CommandBar.createCommandBar(controller, false);
//        commandBar2.addCommand( new Command("Assign Integer", "assign(source:%I(value), target:%2)", controller));
//        commandBar2.addCommand( new Command("Assign String", "assign(source:%S(value), target:%2)", controller));
//        commandBar2.addCommand( new Command("Create Element", "create(name:%S(name), class:%2, container:%1)", controller));
//        commandBar2.addCommand( new Command("Create Object", "create(name:%S(name), class:%2, targetX:%x, targetY:%y)", controller));
//        commandBar2.addCommand( new Command("Create Link", "link(name:%S(name), container:%1, target:%2)", controller));
//        commandBar2.addCommand( new Command("Fire!! :D", "fire(target:%2)", controller));        
//        commandBar2.addCommand( new Command("/\\ (Move north)", "north()", controller));
//        commandBar2.addCommand( new Command("<- (Move west)", "west()", controller));
//        commandBar2.addCommand( new Command("-> (Move east)", "east()", controller));
//        commandBar2.addCommand( new Command("\\/ (Move south)", "south()", controller));     	
    	
        JSplitPane jsplit_play = new JSplitPane( JSplitPane.HORIZONTAL_SPLIT, MapView.create(controller, false), CommandBar.createCommandBar(controller, false) );
        jsplit_play.setDividerSize(3);
        jsplit_play.setResizeWeight(0.99);        
    	mainTabs.add(TAB_PLAY, jsplit_play);
        ImageIcon iconPlay = new ImageIcon(ui.getClass().getResource("/icons/universe.png"));
    	mainTabs.setIconAt( mainTabs.indexOfComponent(jsplit_play), iconPlay);   	
    	
    	// Edit tab:       	
    	JTabbedPane panels = new JTabbedPane();
        mainTabs.add(TAB_EDIT, panels);
        ImageIcon iconEdit = new ImageIcon(ui.getClass().getResource("/icons/edit.png"));
    	mainTabs.setIconAt( mainTabs.indexOfComponent(panels), iconEdit);        

        // Map Editor:
        MapEditor mapEditor = MapEditor.create(controller);
        panels.add( TAB_MAP_EDITOR, mapEditor );
        ImageIcon iconMap = new ImageIcon(ui.getClass().getResource("/icons/map.png"));
    	panels.setIconAt( panels.indexOfComponent(mapEditor), iconMap);
    	
    	// Screen Editor_
        JSplitPane jsplit_screenEditor = new JSplitPane( JSplitPane.HORIZONTAL_SPLIT, MapView.create(controller, true), CommandBar.createCommandBar(controller, true) );
        jsplit_screenEditor.setDividerSize(3);
        jsplit_screenEditor.setResizeWeight(0.9);
        jsplit_screenEditor.setDividerLocation(0.9);
                
        panels.add(TAB_SCREEN_EDITOR, jsplit_screenEditor);        

        
        // Class Editor:
    	ClassEditor classEditor = ClassEditor.createClassEditor(controller);
        panels.add( TAB_CLASS_EDITOR, classEditor);
        ImageIcon iconComplex = new ImageIcon(ui.getClass().getResource("/icons/complex_class.png"));
    	panels.setIconAt( panels.indexOfComponent(classEditor), iconComplex);
        
    	// Yggdrasil:
        JSplitPane jsplit_ygg = new JSplitPane( JSplitPane.HORIZONTAL_SPLIT, new YggdrasilEditor(controller).getEditorPanel(), CommandBar.createCommandBar(controller, true) );
        jsplit_ygg.setDividerSize(3);
        jsplit_ygg.setResizeWeight(0.8);        
        panels.add( TAB_YGGDRASIL_EDITOR, jsplit_ygg );        
        ImageIcon iconYggdrasil = new ImageIcon(ui.getClass().getResource("/icons/yggdrasil.png"));
    	panels.setIconAt( panels.indexOfComponent(jsplit_ygg), iconYggdrasil);
    	//panels.setEnabledAt(panels.indexOfComponent(jsplit_ygg), false);
    	
        // Console:
        ui.jtextarea_console.setBackground(Color.BLACK);
        ui.jtextarea_console.setForeground(new Color(0xe1a91b));
        ui.jtextarea_console.setFont( Font.decode(Font.MONOSPACED).deriveFont(Font.PLAIN, 11) ); 
        ui.jtextarea_console.setEditable(false);
        ui.jtextarea_console.setMargin( new Insets(3,3,3,3) );
        //ui.printToConsole("System started. \n");
        ui.printToConsole("Client: " + controller.getClientType() + " " + controller.getClientVer());
        
//        for (Object o : System.getProperties().keySet())
//        ui.printToConsole(o + " ---- " + System.getProperty((String)o ));
        
        ui.printToConsole("OS name: " + System.getProperty("os.name") );
        ui.printToConsole("OS version: " + System.getProperty("os.version") );
        
        ui.printToConsole("Java VM vendor: " + System.getProperty("java.vm.vendor"));
        ui.printToConsole("Java VM name: " + System.getProperty("java.vm.name"));
        ui.printToConsole("Java version: " + System.getProperty("java.version"));
        
        //ui.printToConsole("Yggdrasil initial size: " + controller.getYggdrasil().getRoot().fullsize() );
        ui.printToConsole("------------------------------");
        
        mainTabs.add(TAB_CONSOLE, ui.jscroll_console);
        ImageIcon iconConsole = new ImageIcon(ui.getClass().getResource("/icons/console.png"));
    	mainTabs.setIconAt( mainTabs.indexOfComponent(ui.jscroll_console), iconConsole);
        
        

        
        // JTree Classes:
//        final JTree jtree_classes = new JTree();
//        TreeModel yggdrasilModel = controller.getYggdrasil().getTreeModel(controller.getYggdrasil().getTypes());
//        jtree_classes.setModel(yggdrasilModel);
//        jtree_classes.setCellRenderer(new YggdrasilCellRenderer());
//        jtree_classes.addTreeSelectionListener(new TreeSelectionListener() {
//            @Override
//            public void valueChanged(javax.swing.event.TreeSelectionEvent evt) {
//            	controller.setPrimaryElement(controller.getYggdrasil().getRoot().getWorld());
//                if (jtree_classes.getSelectionPath() != null)
//                    controller.setSecondaryElement((Element) jtree_classes.getSelectionPath().getLastPathComponent());
//            }
//        });
        
        // Entity Panel

//    	ui.jtree_entity.setModel( controller.getYggdrasil().getTreeModel( controller.getSecondaryElement()) );
//        ui.jtree_entity.setCellRenderer(new YggdrasilCellRenderer());
//        ui.jtree_entity.setMo
        
        
        // Tabs: Entity & Classes
//        JTabbedPane tabs_bottomLeft = new JTabbedPane();
//        tabs_bottomLeft.add(TITLE_ENTITY, new JScrollPane(ui.jtree_entity) );        
//        tabs_bottomLeft.add(TITLE_CLASSES, new JScrollPane(jtree_classes) );
        
        // Split Panel (Top:Commands, Bottom:Types):
        //JScrollPane jscroll_commandBar = new JScrollPane(commandBar);
        //jscroll_commandBar.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        
//        JSplitPane jsplit_verticalRight = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
//        jsplit_verticalRight.setAlignmentX(Component.CENTER_ALIGNMENT);
//        jsplit_verticalRight.setAlignmentY(Component.CENTER_ALIGNMENT);
//        jsplit_verticalRight.setLeftComponent(jscroll_commandBar);
//        jsplit_verticalRight.setRightComponent(tabs_bottomLeft);
//        jsplit_verticalRight.setDividerSize(3);
//        jsplit_verticalRight.setResizeWeight(0.6);
//        jsplit_verticalRight.setPreferredSize( new Dimension(COMMAND_BAR_INITIAL_WIDTH,0));
        
        
        // Split Panel (Left:Panels, Right:Commands):
//        jsplit_horizontal.setAlignmentX(Component.CENTER_ALIGNMENT);
//        jsplit_horizontal.setAlignmentY(Component.CENTER_ALIGNMENT);
//        jsplit_horizontal.setLeftComponent(jsplit_verticalLeft);
//        jsplit_horizontal.setRightComponent(jsplit_verticalRight);
//        jsplit_horizontal.setDividerSize(3);
//        jsplit_horizontal.setResizeWeight(0.75);

//        controller.addListener(ui);
        
        return ui;
    }
    
    
//	public static JComponent createMapEditor(ClientAController controller){
//        SelectorTree objectSelector = SelectorTree.create(TITLE_ENTITY, null, controller, false);
//        
//        JSplitPane jsplit_map2 = new JSplitPane( JSplitPane.VERTICAL_SPLIT, new JPanel(), objectSelector );        
//        jsplit_map2.setDividerSize(3);
//        jsplit_map2.setResizeWeight(0.5);
//        
//        JSplitPane jsplit_map = new JSplitPane( JSplitPane.HORIZONTAL_SPLIT, MapView.create(controller), jsplit_map2 );                
//        jsplit_map.setDividerSize(3);
//        jsplit_map.setResizeWeight(0.8);
//        jsplit_map.setDividerLocation(0.8);
//        
//        
//      
//        
//        return jsplit_map;
//	}    
//    
    
    
    @Override
    public void init() {
        controller.setUI(this);
        this.setVisible(true);
    }

   

//   @Override
//    public void paint(Graphics g){
//	   super.paint(g);
//	   map.updateUI();
//    }


    /** Frissítés */
    @Override
    public void refresh(){
     //   map.updateUI();
    }
    
    
    

    @Override
    public Integer askForInteger(String message) {
        String value = JOptionPane.showInputDialog(this, message);
        if (value == null)
        	return null;
        else
        	return Integer.parseInt(value);
    }



    @Override
    public String askForString(String message, String defaultValue) {
        return JOptionPane.showInputDialog(this, message, defaultValue);
    }
    
	@Override
	public String askForCode(Definition def) {
		return ScriptEditor.showEditor(def, controller);
	}       



    @Override
    public Boolean askForBoolean(String message) {
        int value = JOptionPane.showConfirmDialog(
                    this, message, INPUTDIALOG_TITLE, JOptionPane.YES_NO_OPTION);
        return value == JOptionPane.YES_OPTION;
    } 
    
	
	
	@Override
	public void printToConsole(String message){
		jtextarea_console.append("\n" + message);
		jtextarea_console.setText( jtextarea_console.getText() );
	}

	@Override
	public void reportError(Exception e) {
		ErrorReport.create(e, controller.getClientType(), controller.getClientVer());
	}

}
