// Copyright 2018 The Cobalt 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.

#include "starboard/shared/uwp/log_writer_win32.h"

#include <string>

#include "starboard/common/file.h"
#include "starboard/common/log.h"
#include "starboard/common/scoped_ptr.h"
#include "starboard/common/semaphore.h"
#include "starboard/common/string.h"

using starboard::scoped_ptr;
using starboard::ScopedFile;

namespace starboard {
namespace shared {
namespace uwp {
namespace {

class LogWriterWin32 : public ILogWriter {
 public:
  explicit LogWriterWin32(const std::string& file_path) {
    SbFileError out_error = kSbFileOk;
    bool created_ok = false;
    file_.reset(
        new ScopedFile(file_path.c_str(),
                       kSbFileCreateAlways | kSbFileWrite,
                       &created_ok,
                       &out_error));
    if (!created_ok || out_error != kSbFileOk) {
      SB_LOG(ERROR) << "Could not create watchdog file " << file_path;
      file_.reset();
    }
  }

  ~LogWriterWin32() {
    FlushToDisk();
  }

  void Write(const char* content, int size) override {
    starboard::ScopedLock lock(mutex_);
    if (IsValid_Locked()) {
      file_->Write(content, size);
    }
    return;
  }

 private:
  bool IsValid_Locked() const {
    return file_ && file_->IsValid();
  }

  void FlushToDisk()  {
    starboard::ScopedLock lock(mutex_);
    if (IsValid_Locked()) {
      file_->Flush();
    }
  }
  std::string file_path_;
  starboard::Mutex mutex_;
  scoped_ptr<ScopedFile> file_;
};

}  // namespace.

scoped_ptr<ILogWriter> CreateLogWriterWin32(const char* path) {
  scoped_ptr<ILogWriter> output(new LogWriterWin32(path));
  return output.Pass();
}

}  // namespace uwp
}  // namespace shared
}  // namespace starboard
