package com.emonster.taroaichat.domain;

import static com.emonster.taroaichat.domain.AssertUtils.bigDecimalCompareTo;
import static org.assertj.core.api.Assertions.assertThat;

public class DonationAsserts {

    /**
     * Asserts that the entity has all properties (fields/relationships) set.
     *
     * @param expected the expected entity
     * @param actual the actual entity
     */
    public static void assertDonationAllPropertiesEquals(Donation expected, Donation actual) {
        assertDonationAutoGeneratedPropertiesEquals(expected, actual);
        assertDonationAllUpdatablePropertiesEquals(expected, actual);
    }

    /**
     * Asserts that the entity has all updatable properties (fields/relationships) set.
     *
     * @param expected the expected entity
     * @param actual the actual entity
     */
    public static void assertDonationAllUpdatablePropertiesEquals(Donation expected, Donation actual) {
        assertDonationUpdatableFieldsEquals(expected, actual);
        assertDonationUpdatableRelationshipsEquals(expected, actual);
    }

    /**
     * Asserts that the entity has all the auto generated properties (fields/relationships) set.
     *
     * @param expected the expected entity
     * @param actual the actual entity
     */
    public static void assertDonationAutoGeneratedPropertiesEquals(Donation expected, Donation actual) {
        assertThat(actual)
            .as("Verify Donation auto generated properties")
            .satisfies(a -> assertThat(a.getId()).as("check id").isEqualTo(expected.getId()))
            .satisfies(a -> assertThat(a.getCreatedBy()).as("check createdBy").isEqualTo(expected.getCreatedBy()))
            .satisfies(a -> assertThat(a.getCreatedDate()).as("check createdDate").isEqualTo(expected.getCreatedDate()));
    }

    /**
     * Asserts that the entity has all the updatable fields set.
     *
     * @param expected the expected entity
     * @param actual the actual entity
     */
    public static void assertDonationUpdatableFieldsEquals(Donation expected, Donation actual) {
        assertThat(actual)
            .as("Verify Donation relevant properties")
            .satisfies(a ->
                assertThat(a.getAmount()).as("check amount").usingComparator(bigDecimalCompareTo).isEqualTo(expected.getAmount())
            )
            .satisfies(a -> assertThat(a.getCurrency()).as("check currency").isEqualTo(expected.getCurrency()))
            .satisfies(a ->
                assertThat(a.getStripePaymentIntentId()).as("check stripePaymentIntentId").isEqualTo(expected.getStripePaymentIntentId())
            )
            .satisfies(a -> assertThat(a.getStatus()).as("check status").isEqualTo(expected.getStatus()));
    }

    /**
     * Asserts that the entity has all the updatable relationships set.
     *
     * @param expected the expected entity
     * @param actual the actual entity
     */
    public static void assertDonationUpdatableRelationshipsEquals(Donation expected, Donation actual) {
        assertThat(actual)
            .as("Verify Donation relationships")
            .satisfies(a -> assertThat(a.getSession()).as("check session").isEqualTo(expected.getSession()))
            .satisfies(a -> assertThat(a.getUserProfile()).as("check userProfile").isEqualTo(expected.getUserProfile()));
    }
}
