// Copyright 2017 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

/// A Bazel Build Event parsed from its JSON representation. Currently this is only used for seeing
/// what files are generated.
class BazelBuildEvent {
  let files: [String]

  init(eventDictionary: [String: AnyObject]) {
    var files = [String]()
    if let namedSetOfFiles = eventDictionary["namedSetOfFiles"] as? [String: AnyObject],
       let fileDicts = namedSetOfFiles["files"] as? [[String: AnyObject]] {
      for fileDict in fileDicts {
        guard let uri = fileDict["uri"] as? String else { continue }
        // File URIs have a 'file://' prefix, so remove if present.
        if uri.hasPrefix("file://") {
          files.append(uri.substring(from: uri.index(uri.startIndex, offsetBy: 7)))
        }
      }
    }
    self.files = files
  }
}

class BazelBuildEventsReader {

  private let filePath: String
  private let localizedMessageLogger: LocalizedMessageLogger

  init(filePath: String, localizedMessageLogger: LocalizedMessageLogger) {
    self.filePath = filePath
    self.localizedMessageLogger = localizedMessageLogger
  }

  func readAllEvents() throws -> [BazelBuildEvent] {
    let string = try String(contentsOfFile: filePath, encoding: .utf8)
    var newEvents = [BazelBuildEvent]()
    string.enumerateLines { line, _ in
      guard let event = self.parseBuildEventFromLine(line) else { return }
      newEvents.append(event)
    }
    return newEvents
  }

  func parseBuildEventFromLine(_ line: String) -> BazelBuildEvent? {
    guard let data = line.data(using: .utf8) else {
      localizedMessageLogger.warning("BazelParseBuildEventFailed",
                                     comment: "Error to show when unable to parse a Bazel Build Event JSON dictionary. Additional information: %1$@.",
                                     values:"Failed to convert string to UTF-8")
      return nil
    }
    do {
      guard let json = try JSONSerialization.jsonObject(with: data,
                                                        options: JSONSerialization.ReadingOptions())
                                                        as? [String: AnyObject] else {
        localizedMessageLogger.warning("BazelParseBuildEventFailed",
                                       comment: "Error to show when unable to parse a Bazel Build Event JSON dictionary. Additional information: %1$@.",
                                       values:"Failed to parse event JSON from string: " + line)
        return nil
      }
      return BazelBuildEvent(eventDictionary: json)
    } catch let e as NSError {
      localizedMessageLogger.warning("BazelParseBuildEventFailed",
                                     comment: "Error to show when unable to parse a Bazel Build Event JSON dictionary. Additional information: %1$@.",
                                     values:"Error when parsing JSON: " + e.localizedDescription)
      return nil
    } catch {
      localizedMessageLogger.warning("BazelParseBuildEventFailed",
                                     comment: "Error to show when unable to parse a Bazel Build Event JSON dictionary. Additional information: %1$@.",
                                     values:"Unknown error when parsing JSON from string: " + line)
      return nil
    }
  }
}
