//===-- MICmnLogMediumFile.h ------------------------------------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#pragma once

// In-house headers:
#include "MICmnBase.h"
#include "MICmnLog.h"
#include "MIUtilDateTimeStd.h"
#include "MIUtilFileStd.h"
#include "MIUtilString.h"

//++
//============================================================================
// Details: MI common code implementation class. Logs application fn
// trace/message/
//          error messages to a file. Used as part of the CMICmnLog Logger
//          system. When instantiated *this object is register with the Logger
//          which the Logger when given data to write to registered medium comes
//          *this medium.
//          Singleton class.
//--
class CMICmnLogMediumFile : public CMICmnBase, public CMICmnLog::IMedium {
  // Statics:
public:
  static CMICmnLogMediumFile &Instance();

  // Methods:
public:
  bool SetHeaderTxt(const CMIUtilString &vText);
  bool SetVerbosity(const MIuint veType);
  MIuint GetVerbosity() const;
  const CMIUtilString &GetFileName() const;
  const CMIUtilString &GetFileNamePath() const;
  bool IsOk() const;
  bool IsFileExist() const;
  const CMIUtilString &GetLineReturn() const;
  bool SetDirectory(const CMIUtilString &vPath);

  // Overridden:
public:
  // From CMICmnBase
  /* dtor */ ~CMICmnLogMediumFile() override;
  // From CMICmnLog::IMedium
  bool Initialize() override;
  const CMIUtilString &GetName() const override;
  bool Write(const CMIUtilString &vData,
             const CMICmnLog::ELogVerbosity veType) override;
  const CMIUtilString &GetError() const override;
  bool Shutdown() override;

  // Methods:
private:
  /* ctor */ CMICmnLogMediumFile();
  /* ctor */ CMICmnLogMediumFile(const CMICmnLogMediumFile &);
  void operator=(const CMICmnLogMediumFile &);

  bool FileWriteEnglish(const CMIUtilString &vData);
  bool FileFormFileNamePath();
  CMIUtilString MassagedData(const CMIUtilString &vData,
                             const CMICmnLog::ELogVerbosity veType);
  bool FileWriteHeader();
  char ConvertLogVerbosityTypeToId(const CMICmnLog::ELogVerbosity veType) const;
  CMIUtilString ConvertCr(const CMIUtilString &vData) const;

  // Attributes:
private:
  const CMIUtilString m_constThisMediumName;
  const CMIUtilString m_constMediumFileNameFormat;
  //
  CMIUtilString m_strMediumFileName;
  CMIUtilString m_strMediumFileDirectory;
  CMIUtilString m_fileNamePath;
  MIuint m_eVerbosityType;
  CMIUtilString m_strDate;
  CMIUtilString m_fileHeaderTxt;
  CMIUtilFileStd m_file;
  CMIUtilDateTimeStd m_dateTime;
};
