// Copyright 2016 The Tulsi Authors. All rights reserved.
//
// 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
//
//      http://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

public enum XcodeActionType: String {
    case BuildAction,
         LaunchAction,
         TestAction
}

/// Models an xcscheme file, providing information to Xcode on how to build targets.
final class XcodeScheme {

  typealias BuildActionEntryAttributes = [String: String]
  enum LaunchStyle: String {
    case Normal = "0"
    case AppExtension = "2"
  }

  enum RunnableDebuggingMode: String {
    case Default = "0"
    case Remote = "2"
  }

  let version: String
  let target: PBXTarget
  let project: PBXProject
  let projectBundleName: String
  let testActionBuildConfig: String
  let launchActionBuildConfig: String
  let profileActionBuildConfig: String
  let analyzeActionBuildConfig: String
  let archiveActionBuildConfig: String
  let appExtension: Bool
  let extensionType: String?
  let launchStyle: LaunchStyle
  let runnableDebuggingMode: RunnableDebuggingMode
  let explicitTests: [PBXTarget]?
  // List of additional targets and their project bundle names that should be built along with the
  // primary target.
  let additionalBuildTargets: [(PBXTarget, String, BuildActionEntryAttributes)]?

  let primaryTargetBuildableReference: BuildableReference
  let commandlineArguments: [String]
  let environmentVariables: [String: String]
  let preActionScripts: [XcodeActionType: String]
  let postActionScripts: [XcodeActionType: String]
  let localizedMessageLogger: LocalizedMessageLogger

  init(target: PBXTarget,
       project: PBXProject,
       projectBundleName: String,
       testActionBuildConfig: String = "Debug",
       launchActionBuildConfig: String = "Debug",
       profileActionBuildConfig: String = "Release",
       analyzeActionBuildConfig: String = "Debug",
       archiveActionBuildConfig: String = "Release",
       appExtension: Bool = false,
       extensionType: String? = nil,
       launchStyle: LaunchStyle = .Normal,
       runnableDebuggingMode: RunnableDebuggingMode = .Default,
       version: String = "1.3",
       explicitTests: [PBXTarget]? = nil,
       additionalBuildTargets: [(PBXTarget, String, BuildActionEntryAttributes)]? = nil,
       commandlineArguments: [String] = [],
       environmentVariables: [String: String] = [:],
       preActionScripts: [XcodeActionType: String],
       postActionScripts: [XcodeActionType: String],
       localizedMessageLogger: LocalizedMessageLogger) {
    self.version = version
    self.target = target
    self.project = project
    self.projectBundleName = projectBundleName
    self.testActionBuildConfig = testActionBuildConfig
    self.launchActionBuildConfig = launchActionBuildConfig
    self.profileActionBuildConfig = profileActionBuildConfig
    self.analyzeActionBuildConfig = analyzeActionBuildConfig
    self.archiveActionBuildConfig = archiveActionBuildConfig
    self.appExtension = appExtension
    self.extensionType = extensionType
    self.launchStyle = launchStyle
    self.runnableDebuggingMode = runnableDebuggingMode
    self.explicitTests = explicitTests
    self.additionalBuildTargets = additionalBuildTargets

    self.commandlineArguments = commandlineArguments
    self.environmentVariables = environmentVariables

    self.preActionScripts = preActionScripts
    self.postActionScripts = postActionScripts

    self.localizedMessageLogger = localizedMessageLogger

    primaryTargetBuildableReference = BuildableReference(target: target,
                                                         projectBundleName: projectBundleName)
  }

  func toXML() -> XMLDocument {
    let rootElement = XMLElement(name: "Scheme")
    var rootAttributes = [
        "version": version,
        "LastUpgradeVersion": project.lastUpgradeCheck
    ]
    if appExtension {
      rootAttributes["wasCreatedForAppExtension"] = "YES"
    }
    rootElement.setAttributesWith(rootAttributes)

    rootElement.addChild(buildAction())
    rootElement.addChild(testAction())
    rootElement.addChild(launchAction())
    rootElement.addChild(profileAction())
    rootElement.addChild(analyzeAction())
    rootElement.addChild(archiveAction())

    return XMLDocument(rootElement: rootElement)
  }

  // MARK: - Private methods

  /// Settings for the Xcode "Build" action.
  private func buildAction() -> XMLElement {
    let element = XMLElement(name: "BuildAction")
    let parallelizeBuildables: String
    if runnableDebuggingMode == .Remote {
      parallelizeBuildables = "NO"
    } else {
      parallelizeBuildables = "YES"
    }
    let buildActionAttributes = [
        "parallelizeBuildables": parallelizeBuildables,
        "buildImplicitDependencies": "YES",
    ]
    element.setAttributesWith(buildActionAttributes)

    let buildActionEntries = XMLElement(name: "BuildActionEntries")

    func addBuildActionEntry(_ buildableReference: BuildableReference,
                             buildActionEntryAttributes: BuildActionEntryAttributes) {
      let buildActionEntry = XMLElement(name: "BuildActionEntry")
      buildActionEntry.setAttributesWith(buildActionEntryAttributes)
      buildActionEntry.addChild(buildableReference.toXML())
      buildActionEntries.addChild(buildActionEntry)
    }

    let primaryTargetEntryAttributes = XcodeScheme.makeBuildActionEntryAttributes()
    addBuildActionEntry(primaryTargetBuildableReference,
                        buildActionEntryAttributes: primaryTargetEntryAttributes)
    if let additionalBuildTargets = additionalBuildTargets {
      for (target, bundleName, entryAttributes) in additionalBuildTargets {
        let buildableReference = BuildableReference(target: target, projectBundleName: bundleName)
        addBuildActionEntry(buildableReference, buildActionEntryAttributes: entryAttributes)
      }
    }

    element.addChild(buildActionEntries)
    if let preActionScript = preActionScripts[XcodeActionType.BuildAction] {
        element.addChild(preActionElement(preActionScript))
    }
    if let postActionScript = postActionScripts[XcodeActionType.BuildAction] {
        element.addChild(postActionElement(postActionScript))
    }
    return element
  }

  /// Settings for the Xcode "Test" action.
  private func testAction() -> XMLElement {
    let element = XMLElement(name: "TestAction")
    let testActionAttributes = [
      "buildConfiguration": testActionBuildConfig,
      "selectedDebuggerIdentifier": "Xcode.DebuggerFoundation.Debugger.LLDB",
      "selectedLauncherIdentifier": "Xcode.DebuggerFoundation.Launcher.LLDB",
      "shouldUseLaunchSchemeArgsEnv": "YES",
    ]
    element.setAttributesWith(testActionAttributes)

    let testTargets: [PBXTarget]
    if let explicitTests = explicitTests {
      testTargets = explicitTests
    } else {
      // Hosts should have all of their hosted test targets added as testables and tests should have
      // themselves added.
      let linkedTestTargets = project.linkedTestTargetsForHost(target)
      if linkedTestTargets.isEmpty {
        let host = project.linkedHostForTestTarget(target)
        if host != nil {
          testTargets = [target]
        } else {
          testTargets = []
        }
      } else {
        testTargets = linkedTestTargets
      }
    }

    let testables = XMLElement(name: "Testables")
    for testTarget in testTargets {
      let testableReference = XMLElement(name: "TestableReference")
      testableReference.setAttributesWith(["skipped": "NO"])

      let buildableRef = BuildableReference(target: testTarget,
                                            projectBundleName: projectBundleName)
      testableReference.addChild(buildableRef.toXML())
      testables.addChild(testableReference)
    }

    element.addChild(testables)
    if let preActionScript = preActionScripts[XcodeActionType.TestAction] {
      element.addChild(preActionElement(preActionScript))
    }
    if let postActionScript = postActionScripts[XcodeActionType.TestAction] {
        element.addChild(postActionElement(postActionScript))
    }

    // Test hosts must be emitted as buildableProductRunnables to ensure that Xcode attempts to run
    // the test host binary.
    if explicitTests == nil {
      element.addChild(buildableProductRunnable(runnableDebuggingMode))
    } else {
      element.addChild(macroReference())
    }
    return element
  }

  /// Settings for the Xcode "Run" action.
  private func launchAction() -> XMLElement {
    let element = XMLElement(name: "LaunchAction")
    var attributes = [
        "buildConfiguration": launchActionBuildConfig,
        "selectedDebuggerIdentifier": "Xcode.DebuggerFoundation.Debugger.LLDB",
        "selectedLauncherIdentifier": "Xcode.DebuggerFoundation.Launcher.LLDB",
        "launchStyle": "0",
        "useCustomWorkingDirectory": "NO",
        "ignoresPersistentStateOnLaunch": "NO",
        "debugDocumentVersioning": "YES",
        "debugServiceExtension": "internal",
        "allowLocationSimulation": "YES",
    ]
    if launchStyle == .AppExtension {
      attributes["selectedDebuggerIdentifier"] = ""
      attributes["selectedLauncherIdentifier"] = "Xcode.IDEFoundation.Launcher.PosixSpawn"
      attributes["launchAutomaticallySubstyle"] = launchStyle.rawValue
    }

    element.setAttributesWith(attributes)
    if !self.commandlineArguments.isEmpty {
      element.addChild(commandlineArgumentsElement(self.commandlineArguments))
    }
    element.addChild(environmentVariablesElement(self.environmentVariables))
    if let preActionScript = preActionScripts[XcodeActionType.LaunchAction] {
        element.addChild(preActionElement(preActionScript))
    }
    if let postActionScript = postActionScripts[XcodeActionType.LaunchAction] {
        element.addChild(postActionElement(postActionScript))
    }
    if launchStyle != .AppExtension {
      element.addChild(buildableProductRunnable(runnableDebuggingMode))
    } else if let extensionType = extensionType {
      element.addChild(extensionRunnable(extensionType: extensionType))
    } else {
      // This branch exists to keep compatibility with older packaging rules,
      // where ios_extension does not propagate its extension_type.
      localizedMessageLogger.warning("LegacyIOSExtensionNotSupported",
                                     comment: "Warning shown when generating an Xcode schema for target %1$@ which uses unsupported legacy ios_extension rule", values: target.name)
      element.addChild(macroReference())
    }
    return element
  }

  /// Settings for the Xcode "Profile" action.
  private func profileAction() -> XMLElement {
    let element = XMLElement(name: "ProfileAction")
    let attributes = [
        "buildConfiguration": profileActionBuildConfig,
        "shouldUseLaunchSchemeArgsEnv": "YES",
        "useCustomWorkingDirectory": "NO",
        "debugDocumentVersioning": "YES",
    ]
    element.setAttributesWith(attributes)
    if launchStyle != .AppExtension {
      element.addChild(buildableProductRunnable(runnableDebuggingMode))
    } else {
      element.addChild(buildableProductRunnable(.Default))
    }

    return element
  }

  /// Settings for the Xcode "Analyze" action.
  private func analyzeAction() -> XMLElement {
    let element = XMLElement(name: "AnalyzeAction")
    element.setAttributesWith(["buildConfiguration": analyzeActionBuildConfig,
                                        ])
    return element
  }

  /// Settings for the Xcode "Archive" action.
  private func archiveAction() -> XMLElement {
    let element = XMLElement(name: "ArchiveAction")
    element.setAttributesWith(["buildConfiguration": archiveActionBuildConfig,
                                         "revealArchiveInOrganizer": "YES",
                                        ])
    return element
  }

  /// Container for BuildReference instances that may be run by Xcode.
  private func buildableProductRunnable(_ runnableDebuggingMode: RunnableDebuggingMode) -> XMLElement {
    let element: XMLElement
    var attributes = ["runnableDebuggingMode": runnableDebuggingMode.rawValue]
    switch runnableDebuggingMode {
      case .Remote:
        element = XMLElement(name: "RemoteRunnable")
        // This is presumably watchOS's equivalent of SpringBoard on iOS and comes from the schemes
        // generated by Xcode 7.
        attributes["BundleIdentifier"] = "com.apple.carousel"
        if let productName = target.productName {
          // This should be CFBundleDisplayName for the target but doesn't seem to actually matter.
          attributes["RemotePath"] = "/\(productName)"
        }

      default:
        element = XMLElement(name: "BuildableProductRunnable")
    }
    element.setAttributesWith(attributes)
    element.addChild(primaryTargetBuildableReference.toXML())
    return element
  }

  private func extensionRunnable(extensionType: String) -> XMLElement {
    let element: XMLElement
    let runnableDebuggingMode: RunnableDebuggingMode
    var attributes = [String: String]()

    switch extensionType {
      case "com.apple.intents-service":
        element = XMLElement(name: "RemoteRunnable")
        attributes["BundleIdentifier"] = "com.apple.springboard"
        attributes["RemotePath"] = "/Siri"
        runnableDebuggingMode = .Remote
      default:
        element = XMLElement(name: "BuildableProductRunnable")
        runnableDebuggingMode = .Default
    }
    attributes["runnableDebuggingMode"] = runnableDebuggingMode.rawValue

    element.setAttributesWith(attributes)
    element.addChild(primaryTargetBuildableReference.toXML())
    return element
  }

  /// Container for the primary BuildableReference to be used in situations where it is not
  /// runnable.
  private func macroReference() -> XMLElement {
    let macroExpansion = XMLElement(name: "MacroExpansion")
    macroExpansion.addChild(primaryTargetBuildableReference.toXML())
    return macroExpansion
  }

  /// Generates a CommandlineArguments element based on arguments.
  private func commandlineArgumentsElement(_ arguments: [String]) -> XMLElement {
    let element = XMLElement(name: "CommandLineArguments")
    for argument in arguments {
      let argumentElement = XMLElement(name: "CommandLineArgument")
      argumentElement.setAttributesAs([
        "argument": argument,
        "isEnabled": "YES"
      ])
      element.addChild(argumentElement)
    }
    return element
  }

  /// Generates an EnvironmentVariables element based on vars.
  private func environmentVariablesElement(_ variables: [String: String]) -> XMLElement {
    let element = XMLElement(name:"EnvironmentVariables")
    for (key, value) in variables {
      let environmentVariable = XMLElement(name:"EnvironmentVariable")
      environmentVariable.setAttributesWith([
        "key": key,
        "value": value,
        "isEnabled": "YES"
      ])
      element.addChild(environmentVariable)
    }
    return element
  }

  /// Generates a PreAction element based on run script.
  private func preActionElement(_ script: String) -> XMLElement {
    let element = XMLElement(name:"PreActions")
    let executionAction = XMLElement(name:"ExecutionAction")
    let actionContent = XMLElement(name: "ActionContent")
    actionContent.setAttributesWith([
      "title": "Run Script",
      "scriptText": script
    ])

    let envBuildable = XMLElement(name: "EnvironmentBuildable")
    envBuildable.addChild(primaryTargetBuildableReference.toXML())
    actionContent.addChild(envBuildable)
    executionAction.setAttributesWith(["ActionType": "Xcode.IDEStandardExecutionActionsCore.ExecutionActionType.ShellScriptAction"])

    executionAction.addChild(actionContent)
    element.addChild(executionAction)
    return element
  }

  /// Generates a PostAction element based on run script.
  private func postActionElement(_ script: String) -> XMLElement {
    let element = XMLElement(name:"PostActions")
    let executionAction = XMLElement(name:"ExecutionAction")
    let actionContent = XMLElement(name: "ActionContent")
    actionContent.setAttributesWith([
      "title": "Run Script",
      "scriptText": script
    ])

    let envBuildable = XMLElement(name: "EnvironmentBuildable")
    envBuildable.addChild(primaryTargetBuildableReference.toXML())
    actionContent.addChild(envBuildable)
    executionAction.setAttributesWith(["ActionType": "Xcode.IDEStandardExecutionActionsCore.ExecutionActionType.ShellScriptAction"])
    executionAction.addChild(actionContent)
    element.addChild(executionAction)
    return element
  }

  static func makeBuildActionEntryAttributes(_ analyze: Bool = true,
                                      test: Bool = true,
                                      run: Bool = true,
                                      profile: Bool = true,
                                      archive: Bool = true) -> BuildActionEntryAttributes {
    return [
      "buildForAnalyzing": analyze ? "YES" : "NO",
      "buildForTesting": test ? "YES" : "NO",
      "buildForRunning": run ? "YES" : "NO",
      "buildForProfiling": profile ? "YES" : "NO",
      "buildForArchiving": archive ? "YES" : "NO"
    ]
  }

  /// Information about a PBXTarget that may be built.
  class BuildableReference {
    /// The GID of the target being built.
    let buildableGID: String
    /// The product name of the target being built (e.g., "Application.app").
    let buildableName: String
    /// The name of the target being built.
    let targettName: String
    /// Name of the xcodeproj containing this reference (e.g., "Project.xcodeproj").
    let projectBundleName: String

    convenience init(target: PBXTarget, projectBundleName: String) {
      self.init(buildableGID: target.globalID,
                buildableName: target.buildableName,
                targettName: target.name,
                projectBundleName: projectBundleName)
    }

    init(buildableGID: String,
         buildableName: String,
         targettName: String,
         projectBundleName: String) {
      self.buildableGID = buildableGID
      self.buildableName = buildableName
      self.targettName = targettName
      self.projectBundleName = projectBundleName
    }

    func toXML() -> XMLElement {
      let element = XMLElement(name: "BuildableReference")
      let attributes = [
          "BuildableIdentifier": "primary",
          "BlueprintIdentifier": "\(buildableGID)",
          "BuildableName": "\(buildableName)",
          "BlueprintName": "\(targettName)",
          "ReferencedContainer": "container:\(projectBundleName)"
      ]
      element.setAttributesWith(attributes)
      return element
    }
  }
}
