//
//  Common.cpp
//  MacOSX-Framework
//
//  Created by John Ryland on 2/10/17.
//  Copyright © 2017 John Ryland. All rights reserved.
//

#include "Common.h"
#include <algorithm>
#include <fstream>
#include <iterator>
#include "../Platform/Platform.h"


void loadFile(const char* a_fileName, std::vector<uint8_t>& a_output)
{
  std::ifstream file(GetPathForResource(a_fileName), std::ifstream::binary);
  if (!file.is_open())
  {
    Log(LL_Error, "Can't open file %s", a_fileName);
    return;
  }
  file >> std::noskipws;
  std::copy(std::istream_iterator<uint8_t>(file), std::istream_iterator<uint8_t>(), std::back_inserter(a_output));
}


/*
class ResourceLoadJob : public Task
{
public:
  ResourceLoadJob(const char* a_fileName, std::function<void(const std::vector<uint8_t>&)> a_callback)
    : m_fileName(a_fileName), m_callback(a_callback)
  {
  }
  void execute() override
  {
    loadFile(m_fileName.c_str(), m_data);
  }
  void onCompletion() override
  {
    m_callback(m_data);
  }
private:
  std::string                                       m_fileName;
  std::vector<uint8_t>                              m_data;
  std::function<void(const std::vector<uint8_t>&)>  m_callback;
};
*/

void loadFileAsync(TaskManager& a_mgr, const char* a_fileName, std::function<void(const std::vector<uint8_t>&)> a_callback)
{
  std::string fileName = a_fileName;
  a_mgr.queueTask(std::make_unique<GenericTask<std::vector<uint8_t>>>("loadFileAsync", [fileName](){
    std::vector<uint8_t> data;
    loadFile(fileName.c_str(), data);
    return data;
  }, [a_callback](std::vector<uint8_t> data) {
    a_callback(data);
  }
  ));
  //a_mgr.addTaskToQueueInternal(new ResourceLoadJob(a_fileName, a_callback));
}


void Log(enum LogLevel a_level, const char* a_fmt, ...)
{
  va_list args;
  va_start(args, a_fmt);
  vfprintf(stderr, a_fmt, args);
  fprintf(stderr, "\n");
  va_end(args);
}
