const Clipbench = {
	elements: [],
	types: {
		text: 'text',
		face_dialog: 'face_dialog',
		display_slot: 'display_slot',
		keyframe: 'keyframe',
		face: 'face',
		texture: 'texture',
		outliner: 'outliner',
		texture_selection: 'texture_selection',
	},
	getCopyType(mode, check) {
		// mode: 1 = copy, 2 = paste
		let p = Prop.active_panel;
		let text;
		if (!check) {
			text = getFocusedTextInput() && window.getSelection()+'';
		}
		if (text) {
			return Clipbench.types.text;
		}
		if (Painter.selection.canvas && Toolbox.selected.id == 'copy_paste_tool') {
			return Clipbench.types.texture_selection;
		}
		if (open_dialog == 'uv_dialog') {
			return Clipbench.types.face_dialog
		}
		if (display_mode) {
			return Clipbench.types.display_slot
		}
		if (Animator.open && Timeline.animators.length && (Timeline.selected.length || mode === 2) && ['keyframe', 'timeline', 'preview'].includes(p)) {
			return Clipbench.types.keyframe
		}
		if ((p == 'uv' || p == 'preview') && Modes.edit) {
			return Clipbench.types.face;
		}
		if (p == 'textures' && (Texture.selected || mode === 2)) {
			return Clipbench.types.texture;
		}
		if (p == 'outliner' && Modes.edit) {
			return Clipbench.types.outliner;
		}
	},
	copy(event, cut) {
		switch (Clipbench.getCopyType(1)) {
			case 'text':
				Clipbench.setText(window.getSelection()+'');
				break;
			case 'face_dialog':
				uv_dialog.copy(event);
				break;
			case 'display_slot':
				DisplayMode.copy();
				break;
			case 'keyframe':
				if (Timeline.selected.length) {
					Clipbench.setKeyframes();
					if (cut) {
						BarItems.delete.trigger();
					}
				}
				break;
			case 'face':
				main_uv.copy(event);
				break;
			case 'texture':
				Clipbench.setTexture(Texture.selected);
				if (cut) {
					BarItems.delete.trigger();
				}
				break;
			case 'outliner':
				Clipbench.setElements();
				Clipbench.setGroup();
				if (Group.selected) {
					Clipbench.setGroup(Group.selected);
				} else {
					Clipbench.setElements(selected);
				}
				if (cut) {
					BarItems.delete.trigger();
				}
				break;
		}
	},
	paste(event) {
		switch (Clipbench.getCopyType(2)) {
			case 'text':
				Clipbench.setText(window.getSelection()+'');
				break;
			case 'texture_selection':
				main_uv.addPastingOverlay();
				break;
			case 'face_dialog':
				uv_dialog.paste(event)
				break;
			case 'display_slot':
				DisplayMode.paste();
				break;
			case 'keyframe':
				Clipbench.pasteKeyframes()
				break;
			case 'face':
				main_uv.paste(event);
				break;
			case 'texture':
				Clipbench.pasteTextures();
				break;
			case 'outliner':
				Clipbench.pasteOutliner(event);
				break;
		}
	},
	setGroup(group) {
		if (!group) {
			Clipbench.group = undefined
			return;
		}
		Clipbench.group = group.getSaveCopy()
		if (isApp) {
			clipboard.writeHTML(JSON.stringify({type: 'group', content: Clipbench.group}))
		}
	},
	setElements(arr) {
		if (!arr) {
			Clipbench.elements = []
			return;
		}
		arr.forEach(function(element) {
			Clipbench.elements.push(element.getSaveCopy())
		})
		if (isApp) {
			clipboard.writeHTML(JSON.stringify({type: 'elements', content: Clipbench.elements}))
		}
	},
	setText(text) {
		if (isApp) {
			clipboard.writeText(text)
		} else if (navigator.clipboard) {
			navigator.clipboard.writeText(text);
		} else {
			document.execCommand('copy')
		}
	},
	pasteOutliner(event) {
		Undo.initEdit({outliner: true, elements: [], selection: true});
		//Group
		var target = 'root'
		if (Group.selected) {
			target = Group.selected
			Group.selected.isOpen = true
		} else if (selected[0]) {
			target = selected[0]
		}
		selected.length = 0
		if (isApp) {
			var raw = clipboard.readHTML()
			try {
				var data = JSON.parse(raw)
				if (data.type === 'elements' && data.content) {
					Clipbench.group = undefined;
					Clipbench.elements = data.content;
				} else if (data.type === 'group' && data.content) {
					Clipbench.group = data.content;
					Clipbench.elements = [];
				}
			} catch (err) {}
		}
		if (Clipbench.group) {
			function iterate(obj, parent) {
				if (obj.children) {
					var copy = new Group(obj).addTo(parent).init()
					copy.createUniqueName();

					if (obj.children && obj.children.length) {
						obj.children.forEach((child) => {
							iterate(child, copy)
						})
					}
				} else {
					var el = OutlinerElement.fromSave(obj).addTo(parent).selectLow();
					el.createUniqueName();
					if (el instanceof Cube) {
						Canvas.adaptObjectPosition(el);
					}
				}
			}
			iterate(Clipbench.group, target)
			updateSelection()

		} else if (Clipbench.elements && Clipbench.elements.length) {
			let elements = [];
			Clipbench.elements.forEach(function(obj) {
				var el = OutlinerElement.fromSave(obj).addTo(target).selectLow();
				el.createUniqueName();
				elements.push(el);
			})
			Canvas.updateView({elements});
		}
		Undo.finishEdit('Paste Elements', {outliner: true, elements: selected, selection: true});
	}
}

BARS.defineActions(function() {

	new Action('copy', {
		icon: 'fa-copy',
		category: 'edit',
		work_in_dialog: true,
		condition: () => Clipbench.getCopyType(1, true),
		keybind: new Keybind({key: 'c', ctrl: true, shift: null}),
		click: function (event) {Clipbench.copy(event)}
	})
	new Action('cut', {
		icon: 'fa-cut',
		category: 'edit',
		work_in_dialog: true,
		condition: () => Clipbench.getCopyType(1, true),
		keybind: new Keybind({key: 'x', ctrl: true, shift: null}),
		click: function (event) {Clipbench.copy(event, true)}
	})
	new Action('paste', {
		icon: 'fa-clipboard',
		category: 'edit',
		work_in_dialog: true,
		condition: () => Clipbench.getCopyType(2, true),
		keybind: new Keybind({key: 'v', ctrl: true, shift: null}),
		click: function (event) {Clipbench.paste(event)}
	})
})