using FitConnect;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;

namespace ConsoleAppExample;

public static class SubscriberDemo {
    public static async Task Run(IConfiguration config, ILogger logger) {
        var clientId = config["FitConnect:Subscriber:ClientId"];
        var clientSecret = config["FitConnect:Subscriber:ClientSecret"];
        var privateKeyDecryption = config["FitConnect:Subscriber:PrivateKeyDecryption"];
        var privateKeySigning = config["FitConnect:Subscriber:PrivateKeySigning"];

        if (clientId == null || clientSecret == null || privateKeyDecryption == null ||
            privateKeySigning == null) {
            logger.LogError("Missing configuration values");
            return;
        }

        OutputHelper.PrintSubscriber();

        var subscriber = ClientFactory.GetSubscriberClient(FitConnectEnvironment.Test, clientId,
            clientSecret,
            new List<string>() { await File.ReadAllTextAsync(privateKeyDecryption) },
            await File.ReadAllTextAsync(privateKeySigning),
            logger);

        subscriber.SkipSubmissionDataValidation = true;

        var submissionForPickups =
            await subscriber.GetAvailableSubmissionsAsync(
                Guid.Parse(config["FitConnect:Subscriber:DestinationId"]!));

        foreach (var submission in submissionForPickups) {
            var status = subscriber.GetStatusForSubmission(submission.DestinationId,
                submission.CaseId,
                submission.SubmissionId);
            var outputDirectory = Directory.CreateDirectory(
                Path.Combine(".", "submissions", $"{submission.SubmissionId}", "attachments"));
            try {
                outputDirectory.Create();
                var receivedSubmission =
                    await subscriber.RequestSubmissionAsync(submission.SubmissionId);


                logger.LogInformation("Fachdaten:\r\n\tMimeType: {mimeType}\r\n\t{Data}",
                    receivedSubmission.GetDataMimeType(), receivedSubmission.GetData());

                logger.LogInformation("Schema-URI: {schemaUri}",
                    receivedSubmission.GetDataSchemaUri());
                var metadata = receivedSubmission.Metadata;

                var attachments = await receivedSubmission.GetAttachmentsAsync();
                foreach (var attachment in attachments) {
                    Console.WriteLine(
                        "Anhang:\r\n\tMimeType: {0}\r\n\tDateiname: {1}\r\n\tGröße: {2}",
                        attachment.MimeType, attachment.Filename, attachment.GetBytes().Length);
                    if (attachment.GetBytes().Length == 0)
                        continue;

                    var content = attachment.GetBytes();
                    await File.WriteAllBytesAsync(
                        Path.Combine(outputDirectory.FullName, (attachment.Filename ?? "temp.dat")),
                        content);
                }

                await receivedSubmission
                    .AcceptSubmissionAsync();
            }
            catch (Exception e) {
                logger.LogError(e, "Fehler beim Abrufen der Einreichung");
            }
        }
    }
}