//  Copyright © 2020 Australian Government All rights reserved.

import CoreGraphics
import Foundation

public var defaultFeedbackSettings: FeedbackSettings?

public struct FeedbackSettings {
  let JIRATarget: JMCTarget
  let issueType: String
  let issueComponents: [String]
  let customFields: [String: AnyObject]
  let reporterAvatarImage: CGImage?
  var reporterUsernameOrEmail: String?
  let getReporterInfoAsynchronously: ((@escaping (String?, URL?) -> Void) -> Void)?
  let navigationBarStyle: NavigationBarStyle

  public init(
    JIRATarget: JMCTarget,
    issueType: String? = nil,
    issueComponents: [String]? = nil,
    customFields: [String: AnyObject]? = nil,
    navigationBarStyle: NavigationBarStyle,
    reporterAvatarImage: CGImage? = nil,
    reporterUsernameOrEmail: String? = nil,
    getReporterInfoAsynchronously: ((@escaping (_ usernameOrEmail: String?, _ avatarImageURL: URL?) -> Void) -> Void)? = nil
  ) {
    let defaultIssueType = JIRAIssueType.support.rawValue
    let defaultIssueComponents = ["iOS"] 
    let defaultCustomFields = [String: AnyObject]()

    self.JIRATarget = JIRATarget
    self.issueType = (issueType ?? defaultFeedbackSettings?.issueType) ?? defaultIssueType
    self.issueComponents = (issueComponents ?? defaultFeedbackSettings?.issueComponents) ?? defaultIssueComponents
    self.customFields = (customFields ?? defaultFeedbackSettings?.customFields) ?? defaultCustomFields
    self.reporterAvatarImage = reporterAvatarImage ?? defaultFeedbackSettings?.reporterAvatarImage
    self.reporterUsernameOrEmail = reporterUsernameOrEmail ?? defaultFeedbackSettings?.reporterUsernameOrEmail
    self.getReporterInfoAsynchronously = getReporterInfoAsynchronously ?? defaultFeedbackSettings?.getReporterInfoAsynchronously
    self.navigationBarStyle = navigationBarStyle
  }

  public init(
    issueType: String? = nil,
    issueComponents: [String]? = nil,
    customFields: [String: AnyObject]? = nil,
    navigationBarStyle: NavigationBarStyle = .defaultStyle,
    reporterAvatarImage: CGImage? = nil,
    reporterUsernameOrEmail: String? = nil,
    getReporterInfoAsynchronously: ((@escaping (_ usernameOrEmail: String?, _ avatarImageURL: URL?) -> Void) -> Void)? = nil
  ) throws {
    let target = try defaultFeedbackSettings?.JIRATarget ?? JMCTarget.createTargetFromJSONOnDisk()

    self.init(
      JIRATarget: target,
      issueType: issueType,
      issueComponents: issueComponents,
      customFields: customFields,
      navigationBarStyle: navigationBarStyle,
      reporterAvatarImage: reporterAvatarImage,
      reporterUsernameOrEmail: reporterUsernameOrEmail,
      getReporterInfoAsynchronously: getReporterInfoAsynchronously
    )
  }
}

public enum JIRAIssueType: String {
    case support = "Support"
    case bug = "Bug"
    case task = "Task"
    case improvement = "Improvement"
    case story = "Story"
    case epic = "Epic"
}