<template>
  <div class="my-published-nodes">
    <div class="page-header">
      <div class="header-content">
        <div class="header-text">
          <h1>{{ t('My Published Nodes') }}</h1>
          <p>{{ t('Manage your published nodes in the marketplace') }}</p>
        </div>
      </div>
    </div>

    <div class="content">
      <div class="search-container">
        <div class="search-bar">
          <n-input
            v-model:value="searchQuery"
            :placeholder="t('Search nodes...')"
            clearable
            size="large"
            @keyup.enter="loadNodes"
            class="search-input"
          >
            <template #prefix>
              <n-icon><Icon icon="tabler:search" /></n-icon>
            </template>
          </n-input>
          <n-button type="primary" size="large" @click="loadNodes" class="search-button">
            <template #icon>
              <n-icon><Icon icon="tabler:search" /></n-icon>
            </template>
            {{ t('Search') }}
          </n-button>
        </div>
      </div>

      <div class="nodes-section" v-if="!loading && nodes.length > 0">
        <!-- 排序控件 -->
        <div class="nodes-header">
          <div class="nodes-title">
          </div>
          <div class="sort-controls">
            <n-select
              v-model:value="sortBy"
              :options="sortOptions"
              :placeholder="t('Sort by')"
              style="width: 150px"
              @update:value="loadNodes"
            />
          </div>
        </div>
        
        <div class="nodes-grid">
          <div v-for="node in nodes" :key="node.name" class="node-card">
          <!-- 节点图标 -->
          <div class="node-icon" @click="viewNodeDetail(node)">
            <Icon 
              v-if="node.icon" 
              :icon="node.icon" 
              :width="64" 
              :height="64"
              :style="{ color: node.color || '#6b7280' }"
            />
            <div v-else class="node-icon-placeholder">
              <n-icon size="64"><Icon icon="carbon:add-child-node" /></n-icon>
            </div>
          </div>
          
          <!-- 节点信息 -->
          <div class="node-content">
            <div class="node-header">
              <div class="node-title-section">
                <h3 @click="viewNodeDetail(node)" class="clickable-title">{{ node.title || node.name }}</h3>
                <div class="node-meta">
                  <div class="node-type" v-if="node.node_type">
                    {{ node.node_type }}
                  </div>
                  <span v-if="node.status" class="status-badge" :class="getStatusClass(node.status)">
                    {{ t(node.status) }}
                  </span>
                </div>
              </div>
              <div class="node-name" v-if="node.name">
                {{ node.name }}
              </div>
            </div>
            
            <div class="node-description" v-if="node.description">
              {{ truncateText(node.description, 80) }}
            </div>
            
            <div class="node-meta-info" v-if="node.group">
              <n-icon><Icon icon="tabler:category" /></n-icon>
              <span>{{ node.group }}</span>
            </div>
          </div>

          <div class="node-actions">
            <n-button type="default" @click="viewNodeDetail(node)">
              {{ t('View Details') }}
            </n-button>
            <n-button 
              type="error" 
              @click="deleteNode(node)"
            >
              {{ t('Delete') }}
            </n-button>
          </div>
        </div>
        </div>
        
        <!-- 分页 -->
        <div class="pagination-container">
          <n-pagination 
            v-model:page="page" 
            :page-count="pageCount" 
            size="large"
            show-size-picker
            :page-sizes="[20, 50, 100]"
            :page-size="pageSize"
            @update:page="loadNodes"
            @update:page-size="handlePageSizeChange"
          />
        </div>
      </div>

      <div v-if="loading" class="loading">
        <n-spin size="large">
          <template #description>{{ t('Loading nodes...') }}</template>
        </n-spin>
      </div>

      <div v-if="!loading && nodes.length === 0" class="empty">
        <n-empty :description="t('No nodes found')">
          <template #icon>
            <n-icon><Icon icon="carbon:add-child-node" /></n-icon>
          </template>
        </n-empty>
      </div>
    </div>
  </div>
</template>

<script setup lang="ts">
import { ref, onMounted, computed, watch } from 'vue'
import { useRouter } from 'vue-router'
import { NInput, NButton, NIcon, NSpin, NEmpty, NSelect, NPagination, useMessage, useDialog } from 'naive-ui'
import { Icon } from '@iconify/vue'
import axios from 'axios'
import { t } from '@/shared/i18n'

const message = useMessage()
const dialog = useDialog()
const router = useRouter()

const searchQuery = ref('')
const loading = ref(false)
const nodes = ref<any[]>([])
const total = ref(0)
const page = ref(1)
const pageSize = ref(parseInt(localStorage.getItem('itemsPerPage') || '20'))
const sortBy = ref('creation desc')

// 排序选项
const sortOptions = computed(() => [
  { label: t('Latest'), value: 'creation desc' },
  { label: t('Oldest'), value: 'creation asc' },
  { label: t('Name A-Z'), value: 'name asc' },
  { label: t('Name Z-A'), value: 'name desc' },
  { label: t('Most Popular'), value: 'modified desc' }
])

// 计算总页数
const pageCount = computed(() => Math.max(1, Math.ceil(total.value / pageSize.value)))

async function loadNodes() {
  loading.value = true
  try {
    const params = new URLSearchParams({
      page: page.value.toString(),
      page_size: pageSize.value.toString(),
      search: searchQuery.value,
      sort_by: sortBy.value
    })
    
    const response = await axios.get(`/jingrow/my-published-nodes?${params}`)
    const data = response.data
    
    // 如果API返回分页数据
    if (data.items) {
      nodes.value = data.items
      total.value = data.total || 0
    } else {
      // 兼容旧API格式
      nodes.value = data || []
      total.value = nodes.value.length
    }
  } catch (error) {
    console.error('Failed to load nodes:', error)
    message.error(t('Failed to load nodes'))
    nodes.value = []
    total.value = 0
  } finally {
    loading.value = false
  }
}

function handlePageSizeChange(newPageSize: number) {
  pageSize.value = newPageSize
  page.value = 1
  localStorage.setItem('itemsPerPage', newPageSize.toString())
  loadNodes()
}

function viewNodeDetail(node: any) {
  // 跳转到节点详情页面，传递返回路径
  router.push({
    path: `/node-marketplace/${node.name}`,
    query: { returnTo: '/my-published-nodes' }
  })
}

function truncateText(text: string, maxLength: number): string {
  if (!text) return ''
  if (text.length <= maxLength) return text
  return text.substring(0, maxLength) + '...'
}

function getStatusClass(status: string): string {
  if (!status) return ''
  // 将状态转换为小写，并将空格替换为连字符
  return status.toLowerCase().replace(/\s+/g, '-')
}

async function deleteNode(node: any) {
  // 使用记录的name字段删除
  const recordName = node.name
  if (!recordName) {
    message.error(t('Node name does not exist'))
    return
  }
  
  // 显示确认对话框，显示节点标题
  const nodeTitle = node.title || node.node_type || recordName
  dialog.warning({
    title: t('Confirm Delete'),
    content: t('Are you sure you want to delete node "{0}"? This action cannot be undone.').replace('{0}', nodeTitle),
    positiveText: t('Confirm Delete'),
    negativeText: t('Cancel'),
    onPositiveClick: async () => {
      await performDelete(recordName)
    }
  })
}

async function performDelete(nodeName: string) {
  try {
    // 调用本地API，由后端转发到云端
    const response = await axios.post('/jingrow/delete-published-node', {
      name: nodeName
    })
    
    if (response.data && response.data.success) {
      message.success(response.data.message || t('Node deleted successfully'))
      // 刷新节点列表
      loadNodes()
    } else {
      const errorMsg = response.data?.message || response.data?.error || t('Delete failed')
      message.error(errorMsg)
    }
  } catch (error: any) {
    console.error('Delete node error:', error)
    const errorMsg = error.response?.data?.detail || 
                     error.response?.data?.message || 
                     error.message || 
                     t('Delete failed')
    message.error(errorMsg)
  }
}

onMounted(() => {
  loadNodes()
})

// 监听搜索和排序变化
watch([searchQuery, sortBy], () => {
  page.value = 1 // 重置到第一页
  loadNodes()
}, { deep: true })

// 监听分页变化
watch([page], () => {
  loadNodes()
})

// 监听每页数量变化（从系统设置）
watch(() => localStorage.getItem('itemsPerPage'), (newValue) => {
  if (newValue) {
    pageSize.value = parseInt(newValue)
    page.value = 1 // 重置到第一页
    loadNodes()
  }
})
</script>

<style scoped>
.my-published-nodes {
  padding: 24px;
}

.page-header {
  margin-bottom: 32px;
}

.header-content {
  display: flex;
  justify-content: space-between;
  align-items: flex-start;
}

.header-text h1 {
  margin: 0 0 8px 0;
  font-size: 28px;
  font-weight: 700;
  color: #1a1a1a;
}

.header-text p {
  margin: 0;
  color: #666;
  font-size: 16px;
}

.search-container {
  display: flex;
  justify-content: center;
  margin-bottom: 32px;
}

.nodes-section {
  margin-bottom: 32px;
}

.nodes-header {
  display: flex;
  justify-content: space-between;
  align-items: center;
  margin-bottom: 24px;
}

.nodes-title h2 {
  margin: 0;
  font-size: 20px;
  font-weight: 600;
  color: #1f2937;
}

.sort-controls {
  display: flex;
  align-items: center;
  gap: 12px;
}

.pagination-container {
  display: flex;
  justify-content: center;
  margin-top: 32px;
  padding: 20px 0;
}

.search-bar {
  display: flex;
  gap: 16px;
  align-items: center;
  max-width: 600px;
  width: 100%;
  padding: 20px;
  background: linear-gradient(135deg, #f8fafc 0%, #f1f5f9 100%);
  border-radius: 20px;
  border: 1px solid #e2e8f0;
  box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
}

.search-input {
  flex: 1;
  min-width: 0;
}

.search-input .n-input {
  border-radius: 12px;
  border: 1px solid #d1d5db;
  transition: all 0.2s ease;
}

.search-input .n-input:focus-within {
  border-color: #3b82f6;
  box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1);
}

.search-button {
  border-radius: 12px;
  font-weight: 600;
  padding: 0 24px;
  transition: all 0.2s ease;
}

.search-button:hover {
  transform: translateY(-1px);
  box-shadow: 0 4px 12px rgba(59, 130, 246, 0.3);
}

.nodes-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));
  gap: 24px;
}

.node-card {
  border: 1px solid #e5e7eb;
  border-radius: 16px;
  background: white;
  overflow: hidden;
  transition: all 0.3s ease;
  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
}

.node-card:hover {
  transform: translateY(-4px);
  box-shadow: 0 8px 25px rgba(0, 0, 0, 0.15);
  border-color: #d1d5db;
}

.node-icon {
  position: relative;
  width: 100%;
  height: 200px;
  overflow: hidden;
  background: linear-gradient(135deg, #f3f4f6 0%, #e5e7eb 100%);
  cursor: pointer;
  transition: opacity 0.2s ease;
  display: flex;
  align-items: center;
  justify-content: center;
}

.node-icon:hover {
  opacity: 0.9;
}

.node-icon-placeholder {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 100%;
  height: 100%;
  color: #9ca3af;
  background: linear-gradient(135deg, #f9fafb 0%, #f3f4f6 100%);
}

.node-content {
  padding: 20px;
}

.node-header {
  display: flex;
  justify-content: space-between;
  align-items: flex-start;
  margin-bottom: 12px;
}

.node-title-section {
  flex: 1;
  margin-right: 12px;
}

.node-title-section h3 {
  margin: 0 0 4px 0;
  font-size: 18px;
  font-weight: 600;
  color: #1f2937;
  line-height: 1.2;
}

.clickable-title {
  cursor: pointer;
  transition: color 0.2s ease;
}

.clickable-title:hover {
  color: #10b981;
}

.node-meta {
  display: flex;
  align-items: center;
  gap: 8px;
  flex-wrap: wrap;
  margin-top: 4px;
}

.node-type {
  color: #6b7280;
  font-size: 12px;
  font-weight: 500;
}

.status-badge {
  padding: 4px 10px;
  border-radius: 12px;
  font-size: 11px;
  font-weight: 600;
  letter-spacing: 0.3px;
}

.status-badge.published {
  background: #d1fae5;
  color: #065f46;
}

.status-badge.unpublished {
  background: #fee2e2;
  color: #991b1b;
}

.status-badge.draft {
  background: #fef3c7;
  color: #92400e;
}

.status-badge.active {
  background: #dbeafe;
  color: #1e40af;
}

.status-badge.inactive {
  background: #f3f4f6;
  color: #6b7280;
}

.status-badge.pending {
  background: #dbeafe;
  color: #1e40af;
}

.status-badge.pending-review {
  background: #dbeafe;
  color: #1e40af;
}

.node-name {
  color: #6b7280;
  font-size: 11px;
  font-weight: 500;
  font-family: 'SF Mono', 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;
  background: transparent;
  border: 1px solid #d1d5db;
  border-radius: 12px;
  padding: 4px 10px;
  text-align: center;
  min-width: 70px;
  letter-spacing: 0.3px;
  text-transform: uppercase;
  font-size: 10px;
  transition: all 0.2s ease;
}

.node-name:hover {
  border-color: #9ca3af;
  color: #374151;
  transform: translateY(-1px);
  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
}

.node-description {
  color: #6b7280;
  font-size: 14px;
  line-height: 1.5;
  margin-bottom: 12px;
}

.node-meta-info {
  display: flex;
  align-items: center;
  gap: 4px;
  font-size: 12px;
  color: #6b7280;
  font-weight: 500;
}

.node-meta-info .n-icon {
  color: #9ca3af;
  font-size: 14px;
}

.node-actions {
  padding: 0 20px 20px;
  display: flex;
  gap: 12px;
}

.node-actions .n-button {
  flex: 1;
}

.loading, .empty {
  display: flex;
  justify-content: center;
  align-items: center;
  min-height: 300px;
}

/* 响应式设计 */
@media (max-width: 768px) {
  .header-content {
    flex-direction: column;
    gap: 16px;
    align-items: stretch;
  }
  
  .search-container {
    margin-bottom: 24px;
  }
  
  .search-bar {
    flex-direction: column;
    gap: 12px;
    padding: 16px;
    max-width: 100%;
  }
  
  .search-input {
    width: 100%;
  }
  
  .search-button {
    width: 100%;
  }
  
  .nodes-grid {
    grid-template-columns: 1fr;
    gap: 16px;
  }
  
  .node-card {
    border-radius: 12px;
  }
  
  .node-icon {
    height: 180px;
  }
}
</style>

