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

namespace E2ETest;

public class RejectSubmissionTest : EndToEndTestBase {
    private string _caseId = null!;
    private string _submissionId = null!;

    [Order(10)]
    [Test]
    public void SendingSubmission() {
        // TODO - weaker test for signature validation certificates
        var submission = Sender.WithDestination(Settings.DestinationId)
            .WithServiceType("Straight forward test", Settings.LeikaKey)
            .WithAttachments(new Attachment("Test.pdf", "A simple PDF"))
            .WithJsonData(@"{""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, Settings.DestinationId);

        // 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, Settings.DestinationId);

        // 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, Settings.DestinationId);

        // 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));
    }
}