//===----------------------------------------------------------------------===//
// Copyright © 2025-2026 Apple Inc. and the Containerization project authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//   https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//===----------------------------------------------------------------------===//

import Foundation
import SystemPackage

/// Represents a UnixSocket that can be shared into or out of a container/guest.
public struct UnixSocketConfiguration: Sendable {
    // TODO: Realistically, we can just hash this struct and use it as the "id".
    /// The unique identifier for this socket configuration.
    public var id: String {
        _id
    }

    private let _id = UUID().uuidString

    /// The path to the socket you'd like relayed. For .into
    /// direction this should be the path on the host to a unix socket.
    /// For direction .outOf this should be the path in the container/guest
    /// to a unix socket.
    public var source: URL

    /// The path you'd like the socket to be relayed to. For .into
    /// direction this should be the path in the container/guest. For
    /// direction .outOf this should be the path on your host.
    public var destination: URL

    /// What to set the file permissions of the unix socket being created
    /// to. For .into direction this will be the socket in the guest. For
    /// .outOf direction this will be the socket on the host.
    public var permissions: FilePermissions?

    /// The direction of the relay. `.into` for sharing a unix socket on your
    /// host into the container/guest. `outOf` shares a socket in the container/guest
    /// onto your host.
    public var direction: Direction

    /// Type that denotes the direction of the unix socket relay.
    public enum Direction: Sendable {
        /// Share the socket into the container/guest.
        case into
        /// Share a socket in the container/guest onto the host.
        case outOf
    }

    public init(
        source: URL,
        destination: URL,
        permissions: FilePermissions? = nil,
        direction: Direction = .into
    ) {
        self.source = source
        self.destination = destination
        self.permissions = permissions
        self.direction = direction
    }
}
