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

namespace E2ETest;

[Order(10)]
public class RejectSubmissionTest : EndToEndTestBase {
    private string _caseId = null!;
    private string _submissionId = null!;

    [Order(5)]
    [Test]
    public void CleanServer() {
        var submissionIds = Subscriber.GetAvailableSubmissions(Settings.DestinationId)
            .Select(s => s.Id);
        foreach (var submissionId in submissionIds) {
            try {
                Subscriber.RequestSubmission(submissionId).RejectSubmission();
            }
            catch (Exception e) {
                Logger.LogError(e, "Error rejecting submission {SubmissionId}", 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, 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));
    }
}