// ArgumentProcessor.swift
// Copyright (c) 2024 FastlaneTools

//
//  ** NOTE **
//  This file is provided by fastlane and WILL be overwritten in future updates
//  If you want to add extra functionality to this project, create a new file in a
//  new group so that it won't be marked for upgrade
//

import Foundation

struct ArgumentProcessor {
    let args: [RunnerArgument]
    let currentLane: String
    let commandTimeout: Int
    let port: UInt32

    init(args: [String]) {
        // Dump the first arg which is the program name
        let fastlaneArgs = stride(from: 1, to: args.count - 1, by: 2).map {
            RunnerArgument(name: args[$0], value: args[$0 + 1])
        }
        self.args = fastlaneArgs

        let fastlaneArgsMinusLanes = fastlaneArgs.filter { arg in
            arg.name.lowercased() != "lane"
        }

        let potentialLogMode = fastlaneArgsMinusLanes.filter { arg in
            arg.name.lowercased() == "logmode"
        }

        port = UInt32(fastlaneArgsMinusLanes.first(where: { $0.name == "swiftServerPort" })?.value ?? "") ?? 2000

        // Configure logMode since we might need to use it before we finish parsing
        if let logModeArg = potentialLogMode.first {
            let logModeString = logModeArg.value
            Logger.logMode = Logger.LogMode(logMode: logModeString)
        }

        let lanes = self.args.filter { arg in
            arg.name.lowercased() == "lane"
        }
        verbose(message: lanes.description)

        guard lanes.count == 1 else {
            let message = "You must have exactly one lane specified as an arg, here's what I got: \(lanes)"
            log(message: message)
            fatalError(message)
        }

        let lane = lanes.first!
        currentLane = lane.value

        // User might have configured a timeout for the socket connection
        let potentialTimeout = fastlaneArgsMinusLanes.filter { arg in
            arg.name.lowercased() == "timeoutseconds"
        }

        if let logModeArg = potentialLogMode.first {
            let logModeString = logModeArg.value
            Logger.logMode = Logger.LogMode(logMode: logModeString)
        }

        if let timeoutArg = potentialTimeout.first {
            let timeoutString = timeoutArg.value
            commandTimeout = (timeoutString as NSString).integerValue
        } else {
            commandTimeout = SocketClient.defaultCommandTimeoutSeconds
        }
    }

    func laneParameters() -> [String: String] {
        let laneParametersArgs = args.filter { arg in
            let lowercasedName = arg.name.lowercased()
            return lowercasedName != "timeoutseconds" && lowercasedName != "lane" && lowercasedName != "logmode"
        }
        var laneParameters = [String: String]()
        for arg in laneParametersArgs {
            laneParameters[arg.name] = arg.value
        }
        return laneParameters
    }
}

// Please don't remove the lines below
// They are used to detect outdated files
// FastlaneRunnerAPIVersion [0.9.2]
