package model

import (
	"time"
)

// DatabaseInfo 数据库连接信息
type DatabaseInfo struct {
	ID          string    `json:"id" gorm:"primaryKey;size:36"`       // UUID
	Name        string    `json:"name" gorm:"size:100;not null"`     // 数据库名称
	Description string    `json:"description" gorm:"size:500"`       // 描述
	DBType      string    `json:"db_type" gorm:"size:20;not null"`  // 数据库类型: mysql, postgres, mongodb, neo4j等
	Host        string    `json:"host" gorm:"size:255;not null"`    // 主机地址
	Port        int       `json:"port" gorm:"not null"`             // 端口
	Username    string    `json:"username" gorm:"size:100;not null"` // 用户名
	Password    string    `json:"password" gorm:"size:255"`          // 密码（建议加密存储）
	Database    string    `json:"database" gorm:"size:100"`          // 数据库名
	TableCount  int       `json:"table_count" gorm:"default:0"`     // 子表数量

	// Neo4j 专用字段
	URI               string `json:"uri" gorm:"size:255"`                 // Neo4j 连接地址 (bolt://host:7687)
	GraphLabels       string `json:"graph_labels" gorm:"size:1000"`       // Neo4j 标签列表 (JSON 格式)
	GraphRelationship string `json:"graph_relationship" gorm:"size:1000"` // Neo4j 关系类型列表 (JSON 格式)
	SelectedLabel     string `json:"selected_label" gorm:"size:100"`      // 当前选中的标签

	// 连接选项
	Charset    string `json:"charset" gorm:"size:20;default:utf8mb4"` // 字符集
	SSLMode    string `json:"ssl_mode" gorm:"size:20"`                // SSL模式

	// 时间
	CreatedAt time.Time `json:"created_at"`
	UpdatedAt time.Time `json:"updated_at"`
}

// TableName 表名
func (DatabaseInfo) TableName() string {
	return "database_info"
}

// CreateRequest 创建数据库信息请求（支持同时保存子表配置）
type CreateDatabaseRequest struct {
	Name        string                  `json:"name" binding:"required"`
	Description string                  `json:"description"`
	DBType      string                  `json:"db_type" binding:"required"`
	Host        string                  `json:"host" binding:"required"`
	Port        int                     `json:"port" binding:"required"`
	Username    string                  `json:"username" binding:"required"`
	Password    string                  `json:"password"`
	Database    string                  `json:"database"`
	Charset     string                  `json:"charset"`
	SSLMode     string                  `json:"ssl_mode"`
	SubTables   []CreateSubTableRequest `json:"sub_tables"` // 可选，子表配置
}

// UpdateRequest 更新数据库信息请求
type UpdateDatabaseRequest struct {
	Name                 string                  `json:"name"`
	Description          string                  `json:"description"`
	DBType               string                  `json:"db_type"`
	Host                 string                  `json:"host"`
	Port                 int                     `json:"port"`
	Username             string                  `json:"username"`
	Password             string                  `json:"password"`
	Database             string                  `json:"database"`
	TableCount           int                     `json:"table_count"`
	Charset              string                  `json:"charset"`
	SSLMode              string                  `json:"ssl_mode"`
	URI                  string                  `json:"uri"` // Neo4j 连接地址
	GraphLabels          string                  `json:"graph_labels"`          // Neo4j 标签列表 (JSON)
	GraphRelationship    string                  `json:"graph_relationship"`  // Neo4j 关系类型列表 (JSON)
	SelectedLabel        string                  `json:"selected_label"`       // 当前选中的标签
	SubTables           []CreateSubTableRequest `json:"sub_tables"` // 子表配置
}

// SaveGraphRequest 保存图谱信息请求
type SaveGraphRequest struct {
	DatabaseID         string   `json:"databaseId" binding:"required"`
	DatabaseName       string   `json:"databaseName" binding:"required"`
	URI                string   `json:"uri" binding:"required"`
	Username           string   `json:"username" binding:"required"`
	Labels             []string `json:"labels" binding:"required"`
	RelationshipTypes  []string `json:"relationshipTypes" binding:"required"`
	SelectedLabel      string   `json:"selectedLabel"`
}

// SaveGraphResponse 保存图谱信息响应
type SaveGraphResponse struct {
	Success bool   `json:"success"`
	Message string `json:"message"`
}

// CheckRequest 检查连接请求
type CheckRequest struct {
	DBType     string `json:"db_type" binding:"required"`
	Host       string `json:"host" binding:"required"`
	Port       int    `json:"port" binding:"required"`
	Username   string `json:"username" binding:"required"`
	Password   string `json:"password"`
	Database   string `json:"database"`
	Charset    string `json:"charset"`
	SSLMode    string `json:"ssl_mode"`
	DatabaseID string `json:"database_id"` // 可选，用于获取已保存的字段映射
	URI        string `json:"uri"`          // Neo4j 连接地址，如 bolt://localhost:7687
}

// CheckResponse 检查连接响应
type CheckResponse struct {
	Success    bool              `json:"success"`             // 是否连接成功
	Message    string            `json:"message"`             // 消息
	Tables     []TableDDLInfo    `json:"tables,omitempty"`    // 表列表（关系型数据库）
	Database   string            `json:"database"`            // 数据库名
	Graphs     *GraphOverview    `json:"graphs,omitempty"`    // 图谱概览（Neo4j）
}

// GraphOverview 图谱概览数据
type GraphOverview struct {
	Labels            []LabelCount        `json:"labels"`              // 标签列表
	RelationshipTypes []RelTypeCount      `json:"relationshipTypes"`   // 关系类型列表
	Nodes             []NodeProperty      `json:"nodes"`               // 节点属性定义
	Relationships     []RelProperty       `json:"relationships"`      // 关系属性定义
}

// LabelCount 标签数量统计
type LabelCount struct {
	Name  string `json:"name"`  // 标签名
	Count int    `json:"count"` // 节点数量
}

// RelTypeCount 关系类型数量统计
type RelTypeCount struct {
	Name  string `json:"name"`  // 关系类型名
	Count int    `json:"count"` // 关系数量
}

// NodeProperty 节点属性定义
type NodeProperty struct {
	Label      string          `json:"label"`       // 节点标签名
	Properties []PropertyInfo  `json:"properties"`  // 属性列表
}

// PropertyInfo 属性信息
type PropertyInfo struct {
	Name string `json:"name"` // 属性名
	Type string `json:"type"` // 属性类型
}

// RelProperty 关系属性定义
type RelProperty struct {
	Type      string         `json:"type"`        // 关系类型名
	StartLabel string        `json:"startLabel"`  // 起始节点标签
	EndLabel   string        `json:"endLabel"`    // 目标节点标签
	Properties []PropertyInfo `json:"properties"`  // 属性列表
}

// Neo4jNodeRequest 获取节点详情请求
type Neo4jNodeRequest struct {
	URI        string `json:"uri" binding:"required"`
	Username   string `json:"username" binding:"required"`
	Password   string `json:"password" binding:"required"`
	Database   string `json:"database"`
	Label      string `json:"label" binding:"required"`
	Limit      int    `json:"limit"` // 默认 10
}

// Neo4jNodeResponse 获取节点详情响应
type Neo4jNodeResponse struct {
	Success    bool              `json:"success"`     // 是否成功
	Message    string            `json:"message"`     // 消息
	Nodes      []map[string]interface{} `json:"nodes"`      // 节点数据
	Properties []PropertyInfo    `json:"properties"`   // 属性定义列表
}

// Neo4jRelRequest 获取关系详情请求
type Neo4jRelRequest struct {
	URI              string `json:"uri" binding:"required"`
	Username         string `json:"username" binding:"required"`
	Password         string `json:"password" binding:"required"`
	Database         string `json:"database"`
	RelationshipType string `json:"relationship_type" binding:"required"`
	Limit            int    `json:"limit"` // 默认 10
}

// Neo4jRelResponse 获取关系详情响应
type Neo4jRelResponse struct {
	Success       bool                    `json:"success"`        // 是否成功
	Message       string                  `json:"message"`        // 消息
	Relationships []Neo4jRelationship     `json:"relationships"`  // 关系数据
}

// Neo4jRelationship 关系数据
type Neo4jRelationship struct {
	ID         string                 `json:"id"`          // 关系唯一标识
	Source     string                 `json:"source"`      // 起始节点ID
	Target     string                 `json:"target"`      // 目标节点ID
	Properties map[string]interface{} `json:"properties"`  // 关系属性
}
