// Demo.FileApi
//
// Copyright © Eurostep
//
// All rights reserved.
//
// MIT License
//
// Permission is hereby granted, free of charge, to any person obtaining a copy of
// this software and associated documentation files (the "Software"), to deal in
// the Software without restriction, including without limitation the rights to
// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
// the Software, and to permit persons to whom the Software is furnished to do so,
// subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//

using System.Net.Http.Headers;
using System.Security.Cryptography;

namespace Demo.FileApi;

public static partial class Program
{
    public static async Task UploadUserStoreFileAsync(BasicAuthenticationHeaderValue basicAuthHeader, string baseAddress, string targetFilePath, string sourceFilePath, string spaceId)
    {
        using (var file = new FileStream(sourceFilePath, FileMode.Open))
        {
            string requestUri = $"{baseAddress}/api/space/{spaceId}/user/fs/file/stream/{targetFilePath}";
            HttpClient client = new HttpClient();
            client.DefaultRequestHeaders.Authorization = basicAuthHeader;
            string contentType = MimeMapping.GetMimeMapping(sourceFilePath);

            int size = (int)file.Length;
            byte[] buffer = new byte[size];
            file.ReadExactly(buffer, 0, size);
            var hasher = MD5.Create();
            byte[] hash = hasher.ComputeHash(buffer);
            string checksum = BitConverter.ToString(hash).Replace("-", "").ToLower();
            client.DefaultRequestHeaders.Add("checksum", checksum);

            file.Position = 0;
            var content = new StreamContent(file);
            content.Headers.ContentType = new MediaTypeHeaderValue(contentType);
            HttpResponseMessage response = await client.PostAsync(requestUri, content);
            response.EnsureSuccessStatusCode();
            client.Dispose();
        }
    }
}
