// Copyright 2017 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_file_impl.h"

#include <ppltasks.h>
#include <string>

#include "starboard/common/mutex.h"
#include "starboard/common/scoped_ptr.h"
#include "starboard/common/string.h"
#include "starboard/once.h"
#include "starboard/shared/uwp/log_writer_uwp.h"
#include "starboard/shared/uwp/log_writer_win32.h"

using Windows::Storage::StorageFolder;

namespace starboard {
namespace shared {
namespace uwp {

namespace {

class LogFileImpl {
 public:
  static LogFileImpl* GetInstance();

  void OpenUWP(StorageFolder ^ folder, const char* filename) {
    ScopedLock lock(mutex_);
    impl_.reset();
    impl_ = CreateLogWriterUWP(folder, filename);
  }

  void OpenWin32(const char* path) {
    ScopedLock lock(mutex_);
    impl_.reset();
    impl_ = CreateLogWriterWin32(path);
  }

  void Close() {
    ScopedLock lock(mutex_);
    impl_.reset();
  }

  void Write(const char* text, int text_length) {
    ScopedLock lock(mutex_);
    if (impl_) {
      impl_->Write(text, text_length);
    }
  }

 private:
  LogFileImpl() {}
  starboard::Mutex mutex_;
  starboard::scoped_ptr<ILogWriter> impl_;
};

SB_ONCE_INITIALIZE_FUNCTION(LogFileImpl, LogFileImpl::GetInstance);

}  // namespace

void CloseLogFile() {
  LogFileImpl::GetInstance()->Close();
}

void OpenLogFileUWP(StorageFolder ^ folder, const char* filename) {
  LogFileImpl::GetInstance()->OpenUWP(folder, filename);
}

void OpenLogFileWin32(const char* path) {
  LogFileImpl::GetInstance()->OpenWin32(path);
}

void WriteToLogFile(const char* text, int text_length) {
  if (text_length <= 0) {
    return;
  }
  LogFileImpl::GetInstance()->Write(text, text_length);
}

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