// swift-tools-version:5.9
// The swift-tools-version declares the minimum version of Swift required to build this package.

import PackageDescription

let package = Package(
    name: "PassepartoutLibrary",
    platforms: [
        .iOS(.v15),
        .macOS(.v12),
        .tvOS(.v17)
    ],
    products: [
        // Products define the executables and libraries a package produces, and make them visible to other packages.
        .library(
            name: "PassepartoutLibrary",
            targets: ["PassepartoutLibrary"]),
        .library(
            name: "PassepartoutInterfaces",
            targets: [
                "PassepartoutCore",
                "PassepartoutFrontend",
                "PassepartoutProviders",
                "PassepartoutServices"
            ]),
        .library(
            name: "OpenVPNAppExtension",
            targets: ["OpenVPNAppExtension"]),
        .library(
            name: "WireGuardAppExtension",
            targets: ["WireGuardAppExtension"])
    ],
    dependencies: [
        // Dependencies declare other packages that this package depends on.
        // .package(url: /* package url */, from: "1.0.0"),
//        .package(url: "https://github.com/passepartoutvpn/tunnelkit", from: "6.3.2"),
        .package(url: "https://github.com/passepartoutvpn/tunnelkit", revision: "6ab1759e048867fbca9bd5d33f2dc7eb1fa79ca6"),
//        .package(name: "TunnelKit", path: "../../tunnelkit"),
        .package(url: "https://github.com/zoul/generic-json-swift", from: "2.0.0"),
        .package(url: "https://github.com/SwiftyBeaver/SwiftyBeaver", from: "1.9.0")
    ],
    targets: [
        // Targets are the basic building blocks of a package. A target can define a module or a test suite.
        // Targets can depend on other targets in this package, and on products in packages this package depends on.

        // MARK: Implementations

        .target(
            name: "PassepartoutLibrary",
            dependencies: [
                "PassepartoutFrontend",
                "PassepartoutVPNImpl",
                "PassepartoutProvidersImpl",
            ]),
        .target(
            name: "PassepartoutVPNImpl",
            dependencies: [
                "PassepartoutVPN",
                "SwiftyBeaver",
                .product(name: "TunnelKitLZO", package: "TunnelKit")
            ],
            resources: [
                .process("Data/Profiles.xcdatamodeld")
            ]),
        .target(
            name: "PassepartoutProvidersImpl",
            dependencies: [
                "PassepartoutProviders",
                "PassepartoutServices"
            ],
            resources: [
                .copy("API"),
                .process("Data/Providers.xcdatamodeld")
            ]),

        // MARK: Interfaces

        .target(
            name: "PassepartoutVPN",
            dependencies: [
                "PassepartoutProviders",
                .product(name: "TunnelKit", package: "TunnelKit"),
                .product(name: "TunnelKitOpenVPN", package: "TunnelKit"),
                .product(name: "TunnelKitWireGuard", package: "TunnelKit"),
            ]),
        .target(
            name: "PassepartoutFrontend",
            dependencies: [
                "PassepartoutProviders"
            ]),
        .target(
            name: "PassepartoutProviders",
            dependencies: [
                "PassepartoutCore"
            ]),
        .target(
            name: "PassepartoutServices",
            dependencies: [
                "PassepartoutCore"
            ]),
        .target(
            name: "PassepartoutCore",
            dependencies: [
                .product(name: "GenericJSON", package: "generic-json-swift")
            ]),

        // MARK: App extensions

        .target(
            name: "OpenVPNAppExtension",
            dependencies: [
                .product(name: "TunnelKitOpenVPNAppExtension", package: "TunnelKit"),
                .product(name: "TunnelKitLZO", package: "TunnelKit")
            ]),
        .target(
            name: "WireGuardAppExtension",
            dependencies: [
                .product(name: "TunnelKitWireGuardAppExtension", package: "TunnelKit")
            ]),

        // MARK: Tests

        .testTarget(
            name: "PassepartoutCoreTests",
            dependencies: ["PassepartoutCore"],
            resources: [
                .process("Resources")
            ]),
        .testTarget(
            name: "PassepartoutFrontendTests",
            dependencies: ["PassepartoutFrontend"]),
        .testTarget(
            name: "PassepartoutProvidersTests",
            dependencies: ["PassepartoutProviders"]),
        .testTarget(
            name: "PassepartoutServicesTests",
            dependencies: ["PassepartoutServices"])
    ]
)