// Copyright 2026 Beacon Contributors
// SPDX-License-Identifier: AGPL-3.0-or-later

package api

import "github.com/google/uuid"

// RouteHop is a single resolved hop in a known route.
type RouteHop struct {
	NodeID    uuid.UUID     `json:"nodeId"`
	HashBytes string        `json:"hashBytes"`      // hex-encoded hash prefix
	Node      *ResolvedNode `json:"node,omitempty"` // populated when node details are available
}

// KnownRoute is a fully resolved path through the mesh where all hops
// have been confirmed as high confidence.
type KnownRoute struct {
	ID               int64      `json:"id"`
	IATA             string     `json:"iata"`
	HopCount         int32      `json:"hopCount"`
	Hops             []RouteHop `json:"hops"`
	FirstSeen        int64      `json:"firstSeen"` // epoch ms
	LastSeen         int64      `json:"lastSeen"`  // epoch ms
	ObservationCount int64      `json:"observationCount"`
}

// CrossIATAHop represents the boundary hop between two IATAs in a cross-IATA route.
type CrossIATAHop struct {
	FromNode ResolvedNode `json:"fromNode"` // last node in source IATA
	ToNode   ResolvedNode `json:"toNode"`   // first node in target IATA
	FromIATA string       `json:"fromIata"`
	ToIATA   string       `json:"toIata"`
	LastSeen int64        `json:"lastSeen"` // epoch ms
}

// CrossIATARoute is a route that crosses IATA boundaries.
type CrossIATARoute struct {
	SourceSegment []RouteHop   `json:"sourceSegment"` // route segment in source IATA
	CrossHop      CrossIATAHop `json:"crossHop"`      // the boundary hop
	TargetSegment []RouteHop   `json:"targetSegment"` // route segment in target IATA
	TotalHops     int          `json:"totalHops"`
}
