// 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;
using System.Text;
using Newtonsoft.Json.Linq;

namespace Demo.FileApi;

public static partial class Program
{
    public static async Task BulkUploadFilesAsync(string baseAddress, string sourceDirectory, string apiKey, bool writeLog, string spaceId = null, string participantId = null, string targetDirectory = "/", bool replaceFiles = false, bool deleteFilesAfterUpload = false)
    {
        string path;
        if (spaceId == null)
        {
            path = $"/admin/fileupload";
        }
        else if (spaceId != null && participantId != null)
        {
            path = $"/admin/fileupload/{spaceId}/{participantId}";
        }
        else
        {
            path = $"/admin/fileupload/{spaceId}";
        }

        JObject data = new JObject();
        data["sourceDirectory"] = sourceDirectory;
        data["targetDirectory"] = targetDirectory;
        data["replaceFiles"] = replaceFiles;
        data["deleteFilesAfterUpload"] = deleteFilesAfterUpload;
        data["writeLog"] = writeLog;

        //Hash the data
        byte[] apiKeys = Convert.FromBase64String(apiKey);
        HMACSHA512 hmacsha = new HMACSHA512(apiKeys);
        byte[] hashed = hmacsha.ComputeHash(Encoding.UTF8.GetBytes(path));

        // Convert to proper format
        string output = Convert.ToBase64String(hashed);
        output = output.Split('=')[0]; // Remove any trailing '='s
        output = output.Replace('+', '-'); // 62nd char of encoding
        output = output.Replace('/', '_'); // 63rd char of encoding

        HttpClient client = new HttpClient();
        client.BaseAddress = new Uri(baseAddress);
        client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", output);

        StringContent postParams = new StringContent(data.ToString(), Encoding.UTF8, "application/json");
        HttpResponseMessage response = await client.PostAsync(path, postParams);
        response.EnsureSuccessStatusCode();
        client.Dispose();
    }
}
