// 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
  /// Logic tests do not have a main buildable target.
  let target: PBXTarget?
  let primaryTargetBuildableReference: BuildableReference?

  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 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.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

    if let target = target {
      self.target = target
      primaryTargetBuildableReference = BuildableReference(target: target,
                                                           projectBundleName: projectBundleName)
    } else {
      self.target = nil
      primaryTargetBuildableReference = nil
    }
  }

  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)
    }

    if let primaryTargetBuildableReference = primaryTargetBuildableReference {
      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: [PBXTarget]
      if let target = target {
        linkedTestTargets = project.linkedTestTargetsForHost(target)
      } else {
        linkedTestTargets = []
      }
      if linkedTestTargets.isEmpty {
        if let nativeTarget = target as? PBXNativeTarget,
           nativeTarget.productType.isTest {
          testTargets = [nativeTarget]
        } 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 {
      if let runnable = buildableProductRunnable(runnableDebuggingMode) {
        element.addChild(runnable)
      }
    } else {
      if let reference = macroReference() {
        element.addChild(reference)
      }
    }
    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 {
      if let runnable = buildableProductRunnable(runnableDebuggingMode) {
        element.addChild(runnable)
      }
    } else if let extensionType = extensionType {
      if let runnable = extensionRunnable(extensionType: extensionType) {
        element.addChild(runnable)
      }
    } else if let target = target {
      // 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)
      if let reference = macroReference() {
        element.addChild(reference)
      }
    }
    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)
    let childRunnableDebuggingMode: RunnableDebuggingMode

    if launchStyle != .AppExtension {
      childRunnableDebuggingMode = runnableDebuggingMode
    } else {
      childRunnableDebuggingMode = .Default
    }
    if let runnable = buildableProductRunnable(childRunnableDebuggingMode) {
      element.addChild(runnable)
    }

    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? {
    guard let target = target,
          let primaryTargetBuildableReference = primaryTargetBuildableReference else {
      return nil
    }
    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? {
    guard let primaryTargetBuildableReference = primaryTargetBuildableReference else {
      return nil
    }
    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? {
    guard let primaryTargetBuildableReference = primaryTargetBuildableReference else {
      return nil
    }
    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
    ])

    if let primaryTargetBuildableReference = primaryTargetBuildableReference {
      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
    ])
    if let primaryTargetBuildableReference = primaryTargetBuildableReference {
      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
    }
  }
}
