using FitConnect.Encryption;
using FitConnect.Models;
using FitConnect.Models.v1.Api;
using FluentAssertions;
using Microsoft.Extensions.Logging;

namespace E2ETest;

public class RejectSubmissionTest : EndToEndTestBase {

        private string? _caseId;
    private string? _submissionId;
    
    [Order(10)]
    [Test]
    public void SendingSubmission() {
        var submission = Sender.WithDestination(Settings.DestinationId)
            .WithServiceType("Straight forward test", Settings.LeikaKey)
            .WithAttachments(new Attachment("Test.pdf", "A simple PDF"))
            .WithData(@"{""data"":""value""}")
            .Submit();

        _caseId = submission.CaseId;
        _submissionId = submission.Id;

        _caseId.Should().NotBeNull();
        _submissionId.Should().NotBeNull();
    }

    [Test]
    [Order(20)]
    public void Sender_GetSubmissionState() {
        // Act
        var status = Sender.GetStatusForSubmission(_caseId);

        // Assert
        status.Count.Should().BeGreaterThan(0);
        status.ForEach(s=>Logger.LogInformation("Status {When} {Event}", s.EventTime, s.EventType));
    }

    [Test]
    [Order(30)]
    public void Subscriber_GetSubmissionState() {
        // Act
        var status = Subscriber.GetStatusForSubmission(_caseId);

        // Assert
        status.Count.Should().BeGreaterThan(0);
        status.ForEach(s=>Logger.LogInformation("Status {When} {Event}", s.EventTime, s.EventType));
    }

    [Test]
    [Order(40)]
    public void Reject_Submission() {

        var subscriberWithSubmission = Subscriber.RequestSubmission(_submissionId);

        var data = subscriberWithSubmission.GetDataJson();
        Logger.LogInformation("Data {Data}", data);

        data.Should().Be(@"{""data"":""value""}");

        var attachments = subscriberWithSubmission.GetAttachments();
        attachments.First().Filename.Should().Be("Test.pdf");
        
        subscriberWithSubmission.RejectSubmission(Problems.SchemaViolation, new Problems(){Detail = "A critical problem"});

    }

    [Test]
    [Order(50)]
    public void Sender_GetSubmissionState_AfterRejecting() {
        // Act
        var status = Sender.GetStatusForSubmission(_caseId);

        // Assert
        status.Count.Should().BeGreaterThan(0);
        status.ForEach(s=>Logger.LogInformation("Status {When} {Event}", s.EventTime, s.EventType));

        var rejection = status.First(s => s.EventType == EventType.Reject);

        rejection.Problems.Should().NotBeNull();
        rejection.Problems?.ForEach(p=>Logger.LogWarning(p.Detail));
    }

    
}