//
//  NetworkState.swift
//  punchnet
//
//  Created by 安礼成 on 2026/1/16.
//

import Foundation
import Observation

// 资源列表
struct Resource: Codable {
    var uuid = UUID().uuidString
    var id: Int
    var name: String
    var url: String
    var connectionStatus: String
    
    enum CodingKeys: String, CodingKey {
        case id
        case name
        case url
        case connectionStatus = "connection_status"
    }
}

// 设备列表
struct Node: Codable {
    var id: Int
    var name: String
    var ip: String
    var system: String?
    var connectionStatus: String

    func hash(into hasher: inout Hasher) {
        hasher.combine(id)
    }
    
    enum CodingKeys: String, CodingKey {
        case id
        case name
        case ip
        case system
        case connectionStatus = "connection_status"
    }

    static func == (lhs: Self, rhs: Self) -> Bool {
        return lhs.id == rhs.id
    }
}

// 用来做临时的数据解析
struct NetworkContext: Codable {
    let ip: String
    let maskLen: UInt8
    // 主机名称
    let hostname: String
    let identityId: UInt32
    let resourceList: [Resource]
    let nodeList: [Node]
    
    enum CodingKeys: String, CodingKey {
        case ip
        case maskLen = "mask_len"
        case hostname
        case identityId = "identity_id"
        case resourceList = "resource_list"
        case nodeList = "node_list"
    }
    
    static func `default`() -> Self {
        return .init(ip: "", maskLen: 24, hostname: "", identityId: 0, resourceList: [], nodeList: [])
    }
    
}

// 节点详情
struct NodeDetail: Codable {
    let id: Int
    let name: String
    let ip: String
    let system: String?
    let connectionStatus: String
    let resourceList: [Resource]
    
    enum CodingKeys: String, CodingKey {
        case id
        case name
        case ip
        case system
        case connectionStatus = "connection_status"
        case resourceList = "resource_list"
    }
}

@Observable
class NetworkModel {
    // 当前选中的设备
    var selectedNode: Node?
    var networkContext: NetworkContext = .default()
    
    init() {
        
    }
    
    func changeSelectedNode(nodeId: Int?) {
        if let nodeId {
            if let node = self.networkContext.nodeList.first(where: { $0.id == nodeId}) {
                self.selectedNode = node
            }
        }
    }
    
    func connect(networkSession: UserContext.NetworkSession) async throws -> NetworkContext {
        let params: [String: Any] = [
            "client_id": SystemConfig.getClientId(),
            "access_token": networkSession.accessToken
        ]
        
        self.networkContext = try await SDLAPIClient.doPost(path: "/connect", params: params, as: NetworkContext.self)
        
        return self.networkContext
    }
    
}
