using System.Diagnostics.CodeAnalysis;
using CliWrap;
using CliWrap.Buffered;
using InnovEnergy.Lib.Utils;

namespace InnovEnergy.App.Backend.S3;

[SuppressMessage("ReSharper", "UnusedAutoPropertyAccessor.Global")]
public class S3Cmd
{
    private static readonly Command Python = Cli.Wrap("python3");
    
    private const String? S3CmdPath    = "Resources/s3cmd.py";
    private const String S3Prefix = "s3://";
    
    public String Key       { get; init;} 
    public String Secret    { get; init;} 
    
    // private String?[] DefaultArgs { get; }

    // ReSharper disable StringLiteralTypo
    // ReSharper enable StringLiteralTypo
    [Obsolete("Only to be used by Json-Deserializer")] public S3Cmd()
    {
    }

    // public S3Cmd(String? key, String? secret)
    // {
    //     DefaultArgs = new[]
    //     {
    //         S3CmdPath,
    //         "--access_key", key,
    //         "--secret_key", secret,
    //     };
    // }
    
    public async Task<String> SignUrl(String bucketName, TimeSpan validity)
    {
        var result = await Run(bucketName, "signurl", $"+{validity.TotalSeconds}");
        
        return result
              .StandardOutput
              .Replace("\n", "")
              .Replace(" ", "");
    }
    
    public async Task<Boolean> CreateBucket(String bucketName)
    {
        var result = await Run(bucketName, "mb");
        return result.ExitCode == 0;
    }
    
    public async Task<Boolean> DeleteBucket(String bucketName)
    {
        var result = await Run(bucketName, "rb");
        return result.ExitCode == 0;
    }

    private Task<BufferedCommandResult> Run(String bucketName, String operation, params String[] optionalArgs)
    {
        var credentials = new String[]
        {
            S3CmdPath,
            "--access_key", Key,
            "--secret_key", Secret,
        };
            
        var args = credentials
                  .Append(operation)
                  .Append(bucketName.EnsureStartsWith(S3Prefix))
                  .Concat(optionalArgs);

        return Python
                .WithArguments(args)
                .ExecuteBufferedAsync();
    }
}