using FluentAssertions;
using TeleBot.Models;
using Xunit;

namespace TeleBot.Tests.Models
{
    public class OrderFlowTests
    {
        [Fact]
        public void NewOrderFlow_ShouldHaveDefaultValues()
        {
            // Arrange & Act
            var orderFlow = new OrderFlowData();

            // Assert
            orderFlow.ShippingCountry.Should().Be("United Kingdom");
            orderFlow.CurrentStep.Should().Be(OrderFlowStep.CollectingName);
            orderFlow.UsePGPEncryption.Should().BeFalse();
            orderFlow.IdentityReference.Should().BeNull();
        }

        [Fact]
        public void OrderFlow_ShouldProgressThroughSteps()
        {
            // Arrange
            var orderFlow = new OrderFlowData();

            // Act & Assert - Step 1: Name
            orderFlow.CurrentStep.Should().Be(OrderFlowStep.CollectingName);
            orderFlow.ShippingName = "John Doe";
            orderFlow.CurrentStep = OrderFlowStep.CollectingAddress;

            // Step 2: Address
            orderFlow.CurrentStep.Should().Be(OrderFlowStep.CollectingAddress);
            orderFlow.ShippingAddress = "123 Main Street";
            orderFlow.CurrentStep = OrderFlowStep.CollectingCity;

            // Step 3: City
            orderFlow.CurrentStep.Should().Be(OrderFlowStep.CollectingCity);
            orderFlow.ShippingCity = "London";
            orderFlow.CurrentStep = OrderFlowStep.CollectingPostCode;

            // Step 4: PostCode
            orderFlow.CurrentStep.Should().Be(OrderFlowStep.CollectingPostCode);
            orderFlow.ShippingPostCode = "SW1A 1AA";
            orderFlow.CurrentStep = OrderFlowStep.CollectingCountry;

            // Step 5: Country
            orderFlow.CurrentStep.Should().Be(OrderFlowStep.CollectingCountry);
            orderFlow.ShippingCountry = "United Kingdom";
            orderFlow.CurrentStep = OrderFlowStep.ReviewingOrder;

            // Final validation
            orderFlow.CurrentStep.Should().Be(OrderFlowStep.ReviewingOrder);
            orderFlow.ShippingName.Should().Be("John Doe");
            orderFlow.ShippingAddress.Should().Be("123 Main Street");
            orderFlow.ShippingCity.Should().Be("London");
            orderFlow.ShippingPostCode.Should().Be("SW1A 1AA");
            orderFlow.ShippingCountry.Should().Be("United Kingdom");
        }

        [Fact]
        public void OrderFlow_WithPGPEncryption_ShouldSetFlag()
        {
            // Arrange
            var orderFlow = new OrderFlowData();

            // Act
            orderFlow.UsePGPEncryption = true;

            // Assert
            orderFlow.UsePGPEncryption.Should().BeTrue();
        }

        [Fact]
        public void OrderFlow_WithNotes_ShouldStoreNotes()
        {
            // Arrange
            var orderFlow = new OrderFlowData();

            // Act
            orderFlow.Notes = "Please leave at the front door";

            // Assert
            orderFlow.Notes.Should().Be("Please leave at the front door");
        }

        [Theory]
        [InlineData(OrderFlowStep.CollectingName)]
        [InlineData(OrderFlowStep.CollectingAddress)]
        [InlineData(OrderFlowStep.CollectingCity)]
        [InlineData(OrderFlowStep.CollectingPostCode)]
        [InlineData(OrderFlowStep.CollectingCountry)]
        [InlineData(OrderFlowStep.CollectingNotes)]
        [InlineData(OrderFlowStep.ReviewingOrder)]
        [InlineData(OrderFlowStep.SelectingPaymentMethod)]
        [InlineData(OrderFlowStep.ProcessingPayment)]
        [InlineData(OrderFlowStep.Complete)]
        public void OrderFlowStep_AllSteps_ShouldBeDefined(OrderFlowStep step)
        {
            // Arrange
            var orderFlow = new OrderFlowData();

            // Act
            orderFlow.CurrentStep = step;

            // Assert
            orderFlow.CurrentStep.Should().Be(step);
        }

        [Fact]
        public void OrderFlow_SelectedCurrency_ShouldStore()
        {
            // Arrange
            var orderFlow = new OrderFlowData();

            // Act
            orderFlow.SelectedCurrency = "BTC";

            // Assert
            orderFlow.SelectedCurrency.Should().Be("BTC");
        }

        [Fact]
        public void OrderFlow_IdentityReference_ShouldStore()
        {
            // Arrange
            var orderFlow = new OrderFlowData();

            // Act
            orderFlow.IdentityReference = "ANON-ABC123XYZ";

            // Assert
            orderFlow.IdentityReference.Should().Be("ANON-ABC123XYZ");
        }

        [Fact]
        public void OrderFlow_CompleteFlow_ShouldHaveAllRequiredData()
        {
            // Arrange
            var orderFlow = new OrderFlowData
            {
                IdentityReference = "ANON-TEST123",
                ShippingName = "Jane Smith",
                ShippingAddress = "456 Oak Avenue",
                ShippingCity = "Manchester",
                ShippingPostCode = "M1 1AA",
                ShippingCountry = "United Kingdom",
                Notes = "Ring doorbell twice",
                SelectedCurrency = "XMR",
                UsePGPEncryption = true,
                CurrentStep = OrderFlowStep.Complete
            };

            // Assert
            orderFlow.IdentityReference.Should().NotBeNullOrEmpty();
            orderFlow.ShippingName.Should().NotBeNullOrEmpty();
            orderFlow.ShippingAddress.Should().NotBeNullOrEmpty();
            orderFlow.ShippingCity.Should().NotBeNullOrEmpty();
            orderFlow.ShippingPostCode.Should().NotBeNullOrEmpty();
            orderFlow.ShippingCountry.Should().NotBeNullOrEmpty();
            orderFlow.CurrentStep.Should().Be(OrderFlowStep.Complete);
        }
    }
}