/*
 * Copyright (c) 2020.Huawei Technologies Co., Ltd. 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.
 */

#ifndef FILEMANAGER_H
#define FILEMANAGER_H

#ifdef _WIN32
#include <io.h>
#include <direct.h>
#include <windows.h>
#include <shlwapi.h>
#else
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <dirent.h>
#include <libgen.h>
#endif
#include <cstring>
#include <fstream>
#include <algorithm>
#include <vector>
#include <memory>
#include <cstdio>
#include <iostream>
#include <set>

#include "CommonDataType.h"
#include "Log.h"
#include "ErrorCode.h"

#ifdef _WIN32
#define access _access
#endif

#define BUF_SIZE 32U // Max buffer size
const int TWO = 2;
static const std::string SLASH = "/"; // delimiter used to split path

#ifndef _WIN32
mode_t SetFileDefaultUmask();
mode_t SetFileUmask(mode_t newUmask);
#endif
APP_ERROR GetRealPath(const std::string &srcPath, std::string &resolvedPath);
APP_ERROR ExistFile(const std::string &filePath);
std::vector<std::string> SplitPath(const std::string &str, const std::set<char> delimiters);
APP_ERROR CreateDir(const std::string &dirPath);
void CreateDirRecursively(const std::string &file);
void CreateDirRecursivelyByFile(const std::string &file);
APP_ERROR ReadFile(const std::string &filePath, RawData &fileData);
APP_ERROR ReadFileWithOffset(const std::string &fileName, RawData &fileData, const uint32_t offset);
APP_ERROR ReadBinaryFile(const std::string &fileName, std::shared_ptr<uint8_t> &buffShared, int &buffLength);
std::string GetExtension(const std::string &filePath);
std::string GetName(const std::string &filePath);
std::string GetParent(const std::string &filePath);
APP_ERROR ChangeDir(const std::string &dir);
void SaveFileAppend(const std::string &fileName, const std::string &stream, const int streamLength);
void SaveFileOverwrite(const std::string &fileName, const std::string &stream, const int streamLength);
void CopyFile(const std::string &srcFile, const std::string &destFile);
APP_ERROR SaveFileWithTimeStamp(std::shared_ptr<void> imageBuffer, uint32_t bufferSize, std::string folderName,
                                std::string fileName, std::string fileSuffix);
void GetCurTimeString(std::string &timeString);
#endif
