// Copyright 2015 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef WEBSERVER_WEBSERVD_LOG_MANAGER_H_
#define WEBSERVER_WEBSERVD_LOG_MANAGER_H_

#include <memory>
#include <string>

#include <base/files/file_path.h>
#include <base/macros.h>
#include <base/memory/weak_ptr.h>
#include <base/time/time.h>

struct sockaddr;

namespace webservd {

// A class that manages web server log files and helps with logging web request
// information.
class LogManager final {
 public:
  // Abstract interface for writing a log entry to a storage medium.
  // LogManager provides its own implementation for writing to a log file,
  // while tests can do something different.
  struct LoggerInterface {
    virtual ~LoggerInterface() = default;
    virtual void Log(const base::Time& timestamp, const std::string& entry) = 0;
  };

  LogManager() = default;

  // Initializes the logger and sets the log output directory.
  static void Init(const base::FilePath& log_directory);

  // Called when a request completes, so a new log entry can be added to log.
  static void OnRequestCompleted(const base::Time& timestamp,
                                 const sockaddr* client_addr,
                                 const std::string& method,
                                 const std::string& url,
                                 const std::string& version,
                                 int status_code,
                                 uint64_t response_size);

  // Set a custom logger interface to do stuff other than log to a file.
  static void SetLogger(std::unique_ptr<LoggerInterface> logger);

 private:
  friend class FileLogger;

  // Returns the singleton instance of this class.
  static LogManager* GetInstance();

  // Keeps the last several days' worth of logs and purges the rest, to make
  // sure the log size is kept at bay.
  void PerformLogMaintenance();

  // Directory to write the logs to.
  base::FilePath log_directory_;

  // Logger interface (can be replaced for testing).
  std::unique_ptr<LoggerInterface> logger_;

  base::WeakPtrFactory<LogManager> weak_ptr_factory_{this};
  DISALLOW_COPY_AND_ASSIGN(LogManager);
};

}  // namespace webservd

#endif  // WEBSERVER_WEBSERVD_LOG_MANAGER_H_
