#region Using Statements

using System;
using System.IO;

#endregion

namespace OneDriveArchiver
{
    public static class IoHelper
    {
        /// <summary>
        ///     Archives a one drive file. It takes the file creation date and month,
        ///     creates the necessary folder structure (if necessary) i.e. Year\Month and
        ///     moves the file to the (new) target folder. The Sync engine of OneDrive then
        ///     will sync the changes being made back to the cloud. Base Path is the path where
        ///     the file was found. So the subfolder will start in the same directory.
        /// </summary>
        /// <param name="appName"></param>
        /// <param name="filename">Filename</param>
        public static void ArchiveOneDriveFile(string appName, string targetPath, string filename)
        {
            try
            {
                if (string.IsNullOrEmpty(filename)) throw new ArgumentException("filename cannot be null.");

                // do a check if the file is empty...
                var fi = new FileInfo(filename);
                if (fi.Length == 0)
                {
                    Console.WriteLine($"OneDriveArchiver: Deleting file {filename} as it has zero bytes content.");
                    File.Delete(filename);
                    return;
                }

                var dateModified = File.GetLastWriteTime(filename);
                var fileMonth = dateModified.Month.ToString("D2");
                var fileYear = dateModified.Year.ToString();
                var fileNameWithOutPath = Path.GetFileName(filename);

                // check if we have to create either year or month folder...
                // start with parent year folder...
                var fullYearFolderPath = Path.Combine(targetPath ?? throw new InvalidOperationException(), fileYear);
                var fullMonthFolderPath = Path.Combine(Path.Combine(targetPath, fileYear), fileMonth);
                
                // create the directories if not existing...
                if (!Directory.Exists(fullYearFolderPath)) Directory.CreateDirectory(fullYearFolderPath);
                if (!Directory.Exists(fullMonthFolderPath)) Directory.CreateDirectory(fullMonthFolderPath);
                
                var newFullFileName = Path.Combine(fullMonthFolderPath, fileNameWithOutPath);
                
                // check if the file at the designated new archive location exists. If so, remove the existing file
                // and replace it with the new copy.
                if (File.Exists(newFullFileName))
                {
                    Console.WriteLine($"{appName}: archive file exists at designated folder. Removing the old file for copying the new one instead.");
                    File.Delete(newFullFileName);
                }
                
                // then move the file...
                File.Move(filename, newFullFileName);
                Console.WriteLine($"Moved onedrive file to {newFullFileName} successfully.");
            }
            catch (Exception ex)
            {
                Console.WriteLine(
                    $"Exception while backing up OneDrive file. Message = {ex.Message}, Stacktrace = {ex.StackTrace}");
            }
        }
    }
}