// Copyright (c) 2015 Greenheart Games Pty. Ltd. All rights reserved.
// Use of this source code is governed by the MIT license that can be
// found in the LICENSE file.

// The source code can be found in https://github.com/greenheartgames/greenworks
var fs = require("fs");

var greenworks;

if (process.arch === "x64") {
  if (process.platform === "darwin") greenworks = require("./lib/greenworks-osx64");
  else if (process.platform === "win32") greenworks = require("./lib/greenworks-win64");
  else if (process.platform === "linux") greenworks = require("./lib/greenworks-linux64");
}

function error_process(err, error_callback) {
  if (err && error_callback) error_callback(err);
}

if (greenworks) {
  greenworks.ugcGetItems = function (options, ugc_matching_type, ugc_query_type, success_callback, error_callback) {
    if (typeof options !== "object") {
      error_callback = success_callback;
      success_callback = ugc_query_type;
      ugc_query_type = ugc_matching_type;
      ugc_matching_type = options;
      options = {
        app_id: greenworks.getAppId(),
        page_num: 1,
      };
    }
    greenworks._ugcGetItems(options, ugc_matching_type, ugc_query_type, success_callback, error_callback);
  };

  greenworks.ugcGetUserItems = function (
    options,
    ugc_matching_type,
    ugc_list_sort_order,
    ugc_list,
    success_callback,
    error_callback,
  ) {
    if (typeof options !== "object") {
      error_callback = success_callback;
      success_callback = ugc_list;
      ugc_list = ugc_list_sort_order;
      ugc_list_sort_order = ugc_matching_type;
      ugc_matching_type = options;
      options = {
        app_id: greenworks.getAppId(),
        page_num: 1,
      };
    }
    greenworks._ugcGetUserItems(
      options,
      ugc_matching_type,
      ugc_list_sort_order,
      ugc_list,
      success_callback,
      error_callback,
    );
  };

  greenworks.ugcSynchronizeItems = function (options, sync_dir, success_callback, error_callback) {
    if (typeof options !== "object") {
      error_callback = success_callback;
      success_callback = sync_dir;
      sync_dir = options;
      options = {
        app_id: greenworks.getAppId(),
        page_num: 1,
      };
    }
    greenworks._ugcSynchronizeItems(options, sync_dir, success_callback, error_callback);
  };

  greenworks.publishWorkshopFile = function (
    options,
    file_path,
    image_path,
    title,
    description,
    success_callback,
    error_callback,
  ) {
    if (typeof options !== "object") {
      error_callback = success_callback;
      success_callback = description;
      description = title;
      title = image_path;
      image_path = file_path;
      file_path = options;
      options = {
        app_id: greenworks.getAppId(),
        tags: [],
      };
    }
    greenworks._publishWorkshopFile(
      options,
      file_path,
      image_path,
      title,
      description,
      success_callback,
      error_callback,
    );
  };

  greenworks.updatePublishedWorkshopFile = function (
    options,
    published_file_handle,
    file_path,
    image_path,
    title,
    description,
    success_callback,
    error_callback,
  ) {
    if (typeof options !== "object") {
      error_callback = success_callback;
      success_callback = description;
      description = title;
      title = image_path;
      image_path = file_path;
      file_path = published_file_handle;
      published_file_handle = options;
      options = {
        tags: [], // No tags are set
      };
    }
    greenworks._updatePublishedWorkshopFile(
      options,
      published_file_handle,
      file_path,
      image_path,
      title,
      description,
      success_callback,
      error_callback,
    );
  };

  // An utility function for publish related APIs.
  // It processes remains steps after saving files to Steam Cloud.
  function file_share_process(file_name, image_name, next_process_func, error_callback, progress_callback) {
    if (progress_callback) progress_callback("Completed on saving files on Steam Cloud.");
    greenworks.fileShare(
      file_name,
      function () {
        greenworks.fileShare(
          image_name,
          function () {
            next_process_func();
          },
          function (err) {
            error_process(err, error_callback);
          },
        );
      },
      function (err) {
        error_process(err, error_callback);
      },
    );
  }

  // Publishing user generated content(ugc) to Steam contains following steps:
  // 1. Save file and image to Steam Cloud.
  // 2. Share the file and image.
  // 3. publish the file to workshop.
  greenworks.ugcPublish = function (
    file_name,
    title,
    description,
    image_name,
    success_callback,
    error_callback,
    progress_callback,
  ) {
    var publish_file_process = function () {
      if (progress_callback) progress_callback("Completed on sharing files.");
      greenworks.publishWorkshopFile(
        file_name,
        image_name,
        title,
        description,
        function (publish_file_id) {
          success_callback(publish_file_id);
        },
        function (err) {
          error_process(err, error_callback);
        },
      );
    };
    greenworks.saveFilesToCloud(
      [file_name, image_name],
      function () {
        file_share_process(file_name, image_name, publish_file_process, error_callback, progress_callback);
      },
      function (err) {
        error_process(err, error_callback);
      },
    );
  };

  // Update publish ugc steps:
  // 1. Save new file and image to Steam Cloud.
  // 2. Share file and images.
  // 3. Update published file.
  greenworks.ugcPublishUpdate = function (
    published_file_id,
    file_name,
    title,
    description,
    image_name,
    success_callback,
    error_callback,
    progress_callback,
  ) {
    var update_published_file_process = function () {
      if (progress_callback) progress_callback("Completed on sharing files.");
      greenworks.updatePublishedWorkshopFile(
        published_file_id,
        file_name,
        image_name,
        title,
        description,
        function () {
          success_callback();
        },
        function (err) {
          error_process(err, error_callback);
        },
      );
    };

    greenworks.saveFilesToCloud(
      [file_name, image_name],
      function () {
        file_share_process(file_name, image_name, update_published_file_process, error_callback, progress_callback);
      },
      function (err) {
        error_process(err, error_callback);
      },
    );
  };

  // Greenworks Utils APIs implmentation.
  greenworks.Utils.move = function (source_dir, target_dir, success_callback, error_callback) {
    fs.rename(source_dir, target_dir, function (err) {
      if (err) {
        if (error_callback) error_callback(err);
        return;
      }
      if (success_callback) success_callback();
    });
  };

  greenworks.init = function () {
    if (this.initAPI()) return true;
    if (!this.isSteamRunning()) throw new Error("Steam initialization failed. Steam is not running.");
    var appId;
    try {
      appId = fs.readFileSync("steam_appid.txt", "utf8");
    } catch (e) {
      throw new Error(
        "Steam initialization failed. Steam is running," +
          "but steam_appid.txt is missing. Expected to find it in: " +
          require("path").resolve("steam_appid.txt"),
      );
    }
    if (!/^\d+ *\r?\n?$/.test(appId)) {
      throw new Error(
        "Steam initialization failed. " +
          "steam_appid.txt appears to be invalid; " +
          "it should contain a numeric ID: " +
          appId,
      );
    }
    throw new Error(
      "Steam initialization failed, but Steam is running, " +
        "and steam_appid.txt is present and valid." +
        "Maybe that's not really YOUR app ID? " +
        appId.trim(),
    );
  };

  var EventEmitter = require("events").EventEmitter;
  greenworks.__proto__ = EventEmitter.prototype;
  EventEmitter.call(greenworks);

  greenworks._steam_events.on = function () {
    greenworks.emit.apply(greenworks, arguments);
  };

  process.versions["greenworks"] = greenworks._version;
}

module.exports = greenworks;