// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.

using System;
using System.Globalization;
using System.IO;

using Microsoft.VisualStudio.TestPlatform.Utilities.Helpers.Interfaces;

namespace Microsoft.VisualStudio.TestPlatform.ObjectModel.DataCollection;

/// <summary>
/// Represents required and optional information needed for requesting a file transfer.
/// </summary>
public class FileTransferInformation : BasicTransferInformation
{
    private readonly IFileHelper _fileHelper;

    /// <summary>
    /// Initializes a new instance of the <see cref="FileTransferInformation"/> class.
    /// </summary>
    /// <param name="context">
    /// The context in which the file is being sent.  Cannot be null.
    /// </param>
    /// <param name="path">
    /// The path to the file on the local file system
    /// </param>
    /// <param name="deleteFile">
    /// True to automatically have the file removed after sending it.
    /// </param>
    public FileTransferInformation(DataCollectionContext context, string path, bool deleteFile)
        : this(context, path, deleteFile, new TestPlatform.Utilities.Helpers.FileHelper())
    {
    }

    /// <summary>
    /// Initializes a new instance of the <see cref="FileTransferInformation"/> class.
    /// </summary>
    /// <param name="context">
    /// The context in which the file is being sent.  Cannot be null.
    /// </param>
    /// <param name="path">
    /// The path to the file on the local file system
    /// </param>
    /// <param name="deleteFile">
    /// True to automatically have the file removed after sending it.
    /// </param>
    /// <param name="fileHelper">
    /// The file Helper.
    /// </param>
    [CLSCompliant(false)]
    public FileTransferInformation(DataCollectionContext context, string path, bool deleteFile, IFileHelper fileHelper)
        : base(context)
    {
        _fileHelper = fileHelper;

        // Expand environment variables in the path
        path = Environment.ExpandEnvironmentVariables(path);

        // Make sure the file exists.
        if (!_fileHelper.Exists(path))
        {
            throw new FileNotFoundException(string.Format(CultureInfo.CurrentCulture, Resources.Resources.Common_FileNotExist, [path]), path);
        }

        // Make sure the path we have is a full path (not relative).
        Path = _fileHelper.GetFullPath(path);

        PerformCleanup = deleteFile;
    }

    /// <summary>
    /// Gets the path to the file on the local file system.
    /// </summary>
    public string Path { get; private set; }

    /// <summary>
    /// Indicates if cleanup should be performed after transferring the resource.
    /// </summary>
    protected internal override bool PerformCleanup { get; }

    /// <summary>
    /// The name of the file to use on the client machine.
    /// </summary>
    protected internal override string FileName => Path;

}
