#include "image_io/utils/file_utils.h"

#include <sys/stat.h>
#import <fstream>
#import <iostream>
#import <memory>

#include "image_io/base/data_range.h"
#include "image_io/base/message_handler.h"

namespace photos_editing_formats {
namespace image_io {

using std::fstream;
using std::istream;
using std::ostream;
using std::unique_ptr;

bool GetFileSize(const std::string& file_name, size_t* size) {
  struct stat stat_buf;
  if (stat(file_name.c_str(), &stat_buf)) {
    return false;
  } else {
    if (size) {
      *size = stat_buf.st_size;
    }
    return true;
  }
}

unique_ptr<ostream> OpenOutputFile(const std::string& file_name,
                                   ReportErrorPolicy report_error_policy) {
  auto* file_stream = new fstream(file_name, std::ios::out | std::ios::binary);
  if (file_stream && !file_stream->is_open()) {
    delete file_stream;
    file_stream = nullptr;
    if (report_error_policy == ReportErrorPolicy::kReportError) {
      MessageHandler::Get()->ReportMessage(Message::kStdLibError, file_name);
    }
  }
  return unique_ptr<ostream>(file_stream);
}

unique_ptr<istream> OpenInputFile(const std::string& file_name,
                                  ReportErrorPolicy report_error_policy) {
  auto* file_stream = new fstream(file_name, std::ios::in | std::ios::binary);
  if (file_stream && !file_stream->is_open()) {
    delete file_stream;
    file_stream = nullptr;
    if (report_error_policy == ReportErrorPolicy::kReportError) {
      MessageHandler::Get()->ReportMessage(Message::kStdLibError, file_name);
    }
  }
  return unique_ptr<istream>(file_stream);
}

std::shared_ptr<DataSegment> ReadEntireFile(
    const std::string& file_name, ReportErrorPolicy report_error_policy) {
  size_t buffer_size = 0;
  std::shared_ptr<DataSegment> shared_data_segment;
  if (GetFileSize(file_name, &buffer_size)) {
    unique_ptr<istream> shared_istream =
        OpenInputFile(file_name, ReportErrorPolicy::kDontReportError);
    if (shared_istream) {
      Byte* buffer = new Byte[buffer_size];
      if (buffer) {
        shared_data_segment =
            DataSegment::Create(DataRange(0, buffer_size), buffer);
        shared_istream->read(reinterpret_cast<char*>(buffer), buffer_size);
        size_t bytes_read = shared_istream->tellg();
        if (bytes_read != buffer_size) {
          shared_data_segment.reset();
        }
      }
    }
  }
  if (!shared_data_segment &&
      report_error_policy == ReportErrorPolicy::kReportError) {
    MessageHandler::Get()->ReportMessage(Message::kStdLibError, file_name);
  }
  return shared_data_segment;
}

}  // namespace image_io
}  // namespace photos_editing_formats
