<?php

namespace Tests\Unit;

use Carbon\Carbon
; 

use PHPUnit\Framework\TestCase;

class CompanyFreezeAccountSubscriptionExpirationCalculationTest extends TestCase
{
    private array $subscriptionData; 

    /**
     * Set Up Test
     * 
     * @return void 
     */
    protected function setUp(): void
    {
        parent::setUp();

        //* REFERENCE : FreezeAccountModule@resumeSubscription

        $this->subscriptionData = 
        [
            'subscriptionDate'         => "2023-05-08",
            'subscriptonLastMonthPaid' => "2023-05-31",
            'subscriptionExpiration'   => "2024-06-03",

            'subscriptionDateFroze' => "2023-05-15"
        ];
    }

    /**
     * Test Calculation if Unfroze Same as Date Froze.
     * 
     * @return void 
     */
    public function test_duration_when_unfreeze_at_same_day(): void
    {
        $dateUnFroze                       = Carbon::createFromDate("2023-05-15");

        $dateFroze                         = Carbon::createFromDate($this->subscriptionData['subscriptionDateFroze']);
        $currentMonthPaid                  = Carbon::createFromDate($this->subscriptionData['subscriptonLastMonthPaid']);
        $currentDateSubscriptionExpiration = Carbon::createFromDate($this->subscriptionData['subscriptionExpiration']);

        $dayFrozeTimeFrameDifference   = $dateFroze->diffInDays($dateUnFroze);

        $newCurrentMonthPaid           = $currentMonthPaid->addDays($dayFrozeTimeFrameDifference);
        $newDateSubscriptionExpiration = $currentDateSubscriptionExpiration->addDays($dayFrozeTimeFrameDifference);

        $this->assertTrue($dayFrozeTimeFrameDifference   == 0, "Difference in Days is 0");

        $this->assertTrue($newCurrentMonthPaid == Carbon::createFromDate("2023-05-31"), "New Current Month Paid Date should be 2023-05-31");
        $this->assertTrue($newDateSubscriptionExpiration == Carbon::createFromDate("2024-06-03"), "New Expiration Date should be 2024-06-03");
    }

    /**
     * Test Calculation if Unfroze After One.
     * 
     * @return void 
     */
    public function test_duration_when_unfreeze_after_one_day(): void
    {
        $dateUnFroze                       = Carbon::createFromDate("2023-05-16");

        $dateFroze                         = Carbon::createFromDate($this->subscriptionData['subscriptionDateFroze']);
        $currentMonthPaid                  = Carbon::createFromDate($this->subscriptionData['subscriptonLastMonthPaid']);
        $currentDateSubscriptionExpiration = Carbon::createFromDate($this->subscriptionData['subscriptionExpiration']);

        $dayFrozeTimeFrameDifference   = $dateFroze->diffInDays($dateUnFroze);

        $newCurrentMonthPaid           = $currentMonthPaid->addDays($dayFrozeTimeFrameDifference);
        $newDateSubscriptionExpiration = $currentDateSubscriptionExpiration->addDays($dayFrozeTimeFrameDifference);

        $this->assertTrue($dayFrozeTimeFrameDifference   == 1, "Difference in Days is 1");

        $this->assertTrue($newCurrentMonthPaid == Carbon::createFromDate("2023-06-01"), "New Current Month Paid Date should be 2023-06-01");
        $this->assertTrue($newDateSubscriptionExpiration == Carbon::createFromDate("2024-06-04"), "New Expiration Date should be 2024-06-04");
    }

    /**
     * Test Calculation if Unfroze After one Month.
     * 
     * @return void 
     */
    public function test_duration_when_unfreeze_after_one_month(): void
    {
        $dateUnFroze                       = Carbon::createFromDate("2023-06-15");

        $dateFroze                         = Carbon::createFromDate($this->subscriptionData['subscriptionDateFroze']);
        $currentMonthPaid                  = Carbon::createFromDate($this->subscriptionData['subscriptonLastMonthPaid']);
        $currentDateSubscriptionExpiration = Carbon::createFromDate($this->subscriptionData['subscriptionExpiration']);

        $dayFrozeTimeFrameDifference   = $dateFroze->diffInDays($dateUnFroze);

        $newCurrentMonthPaid           = $currentMonthPaid->addDays($dayFrozeTimeFrameDifference);
        $newDateSubscriptionExpiration = $currentDateSubscriptionExpiration->addDays($dayFrozeTimeFrameDifference);
        
        $this->assertTrue($dayFrozeTimeFrameDifference == 31, "Difference in Days is 31");

        $this->assertTrue($newCurrentMonthPaid == Carbon::createFromDate("2023-07-01"), "New Current Month Paid Date should be 2023-07-01");
        $this->assertTrue($newDateSubscriptionExpiration == Carbon::createFromDate("2024-07-04"), "New Expiration Date should be 2024-07-04");
    }

    /**
     * Test Calculation if Unfroze After one year.
     * 
     * @return void 
     */
    public function test_duration_when_unfreeze_after_one_year(): void
    {
        //* 2024 is a leap year;
        $dateUnFroze                       = Carbon::createFromDate("2024-05-15");

        $dateFroze                         = Carbon::createFromDate($this->subscriptionData['subscriptionDateFroze']);
        $currentMonthPaid                  = Carbon::createFromDate($this->subscriptionData['subscriptonLastMonthPaid']);
        $currentDateSubscriptionExpiration = Carbon::createFromDate($this->subscriptionData['subscriptionExpiration']);

        $dayFrozeTimeFrameDifference   = $dateFroze->diffInDays($dateUnFroze);

        $newCurrentMonthPaid           = $currentMonthPaid->addDays($dayFrozeTimeFrameDifference);
        $newDateSubscriptionExpiration = $currentDateSubscriptionExpiration->addDays($dayFrozeTimeFrameDifference);

        $this->assertTrue($dayFrozeTimeFrameDifference == 366, "Difference in Days is 366");

        $this->assertTrue($newCurrentMonthPaid == Carbon::createFromDate("2024-05-31"), "New Current Month Paid Date should be 2024-05-31");
        $this->assertTrue($newDateSubscriptionExpiration == Carbon::createFromDate("2025-06-04"), "New Expiration Date should be 2025-06-04");
    }
}
