<script setup lang="ts">
import NodeIcon from '@/app/components/NodeIcon.vue';
import type { INodeUi } from '@/Interface';
import { useNodeTypesStore } from '@/app/stores/nodeTypes.store';
import { computed, ref } from 'vue';

import { N8nHeading, N8nIconButton, N8nResizeWrapper } from '@n8n/design-system';
const props = defineProps<{
	node: INodeUi;
}>();

const nodeTypesStore = useNodeTypesStore();

const nodeType = computed(() =>
	nodeTypesStore.getNodeType(props.node.type, props.node.typeVersion),
);

const panelWidth = ref(350);
function onResize({ width }: { width: number }) {
	panelWidth.value = width;
}

const outputFormat = ref<'side-by-side' | 'line-by-line'>('line-by-line');

const emit = defineEmits<{
	close: [];
}>();
</script>

<template>
	<N8nResizeWrapper
		:class="$style.workflowDiffAside"
		:width="panelWidth"
		:min-width="260"
		:supported-directions="['left']"
		:grid-size="8"
		outset
		@resize="onResize"
	>
		<div :class="$style.asideHeader">
			<NodeIcon class="ml-xs" :node-type :size="16" />
			<N8nHeading size="small" color="text-dark" bold :class="$style.nodeTitle">
				{{ node.name }}
			</N8nHeading>
			<N8nIconButton
				variant="ghost"
				icon="x"
				class="ml-auto"
				@click="emit('close')"
			></N8nIconButton>
		</div>
		<slot v-bind="{ outputFormat }" />
	</N8nResizeWrapper>
</template>

<style module lang="scss">
.workflowDiffAside {
	width: calc(v-bind(panelWidth) * 1px);
	display: flex;
	flex-direction: column;
	height: 100%;
	border-left: 1px solid var(--color--foreground);
	border-top: 1px solid var(--color--foreground);
}

.asideHeader {
	display: flex;
	flex-direction: row;
	align-items: center;
	gap: var(--spacing--2xs);
	padding: var(--spacing--xs) var(--spacing--2xs);
}

.nodeTitle {
	flex: 1;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
</style>
