package com.mycompany.flightstatuslistview.homeScreen;

import android.util.Log;

import com.mycompany.flightstatuslistview.FlightModel;

import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;

import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.Calendar;

/**
 * Created by mkaratadipalayam on 11/10/16.
 */
@RunWith(RobolectricTestRunner.class)
public class HomePresenterUnitTest {
    public static String TAG = HomePresenterUnitTest.class.getSimpleName();

    @Before
    public void setUp(){

    }
    @After
    public void tearDown(){

    }

    @Test
    public void presentHomeMetaData_with_vaildInput_shouldCall_displayHomeMetaData(){
        //Given
        HomePresenter homePresenter = new HomePresenter();
        HomeResponse homeResponse = new HomeResponse();
        homeResponse.listOfFlights = new FlightWorker().getFutureFlights();

        HomeActivityInputSpy homeActivityInputSpy = new HomeActivityInputSpy();
        homePresenter.output = new WeakReference<HomeActivityInput>(homeActivityInputSpy);

        //When
        homePresenter.presentHomeMetaData(homeResponse);

        //Then
        Assert.assertTrue("When the valid input is passed to HomePresenter Then displayHomeMetaData should be called", homeActivityInputSpy.isdisplayHomeMetaDataCalled);
    }

    @Test
    public void presentHomeMetaData_with_inVaildInput_shouldNotCall_displayHomeMetaData(){
        //Given
        HomePresenter homePresenter = new HomePresenter();
        HomeResponse homeResponse = new HomeResponse();
        homeResponse.listOfFlights = null;

        HomeActivityInputSpy homeActivityInputSpy = new HomeActivityInputSpy();
        homePresenter.output = new WeakReference<HomeActivityInput>(homeActivityInputSpy);

        //When
        homePresenter.presentHomeMetaData(homeResponse);

        //Then
        Assert.assertFalse("When the valid input is passed to HomePresenter Then displayHomeMetaData should NOT be called", homeActivityInputSpy.isdisplayHomeMetaDataCalled);
    }

    @Test
    public void verify_HomePresenter_getDaysDiff_is_CalcualtedCorrectly_ForFutureTrips(){
        //Given
        HomePresenter homePresenter = new HomePresenter();
        HomeResponse homeResponse = new HomeResponse();

        ArrayList<FlightModel> flightsList = new ArrayList<>();

        FlightModel flight1 = new FlightModel();
        flight1.flightName = "9Z 231";
        flight1.startingTime = "2017/12/31";
        flight1.departureCity = "BLR";
        flight1.arrivalCity = "CJB";
        flight1.departureTime = "18:10";
        flight1.arrivalTime = "19:00";
        flightsList.add(flight1);
        homeResponse.listOfFlights = flightsList;

        HomeActivityInputSpy homeActivityInputSpy = new HomeActivityInputSpy();
        homePresenter.output = new WeakReference<HomeActivityInput>(homeActivityInputSpy);

        //When
        Calendar currentTime = Calendar.getInstance();
        currentTime.set(2017,5,30,0,0,0);
        homePresenter.setCurrentTime(currentTime);
        homePresenter.presentHomeMetaData(homeResponse);

        //Then
        // "It has been " + daysDiff + " days since you flew";
        String ExpectedText = "You have " + "184" + " days to fly";
        String ActualText = homeActivityInputSpy.homeViewModelCopy.listOfFlights.get(0).noOfDaysToFly;
        Assert.assertEquals("When current date is 2016/10/12 & Flying Date is 2016/10/31 Then no of days should be 19",ExpectedText,ActualText);

    }

    @Test
    public void verify_HomePresenter_getDaysDiff_is_CalcualtedCorrectly_ForPastTrips(){
        //Given
        HomePresenter homePresenter = new HomePresenter();
        HomeResponse homeResponse = new HomeResponse();

        ArrayList<FlightModel> flightsList = new ArrayList<>();

        FlightModel flight1 = new FlightModel();
        flight1.flightName = "9Z 231";
        flight1.startingTime = "2016/10/01";
        flight1.departureCity = "BLR";
        flight1.arrivalCity = "CJB";
        flight1.departureTime = "18:10";
        flight1.arrivalTime = "19:00";

        flightsList.add(flight1);


        homeResponse.listOfFlights = flightsList;

        HomeActivityInputSpy homeActivityInputSpy = new HomeActivityInputSpy();
        homePresenter.output = new WeakReference<HomeActivityInput>(homeActivityInputSpy);


        //When
        Calendar currentTime = Calendar.getInstance();
        //currentTime.set(2017,5,30,0,0,0);
        currentTime.set(2017,5,30);
        Log.e(TAG, "verify_HomePresenter_getDaysDiff_is_CalcualtedCorrectly_ForPastTrips: "+currentTime.toString() );
        homePresenter.setCurrentTime(currentTime);
        homePresenter.presentHomeMetaData(homeResponse);


        //Then
        // "It has been " + daysDiff + " days since you flew";
        String ExpectedText = "It has been " + 272 + " days since you flew";
        String ActualText = homeActivityInputSpy.homeViewModelCopy.listOfFlights.get(0).noOfDaysToFly;
        Assert.assertEquals("When current date is 2017/05/30 & Flying Date is 2016/10/01 Then no of days should be 271",ExpectedText,ActualText);

    }

    private class HomeActivityInputSpy implements HomeActivityInput {
        public boolean isdisplayHomeMetaDataCalled = false;
        public HomeViewModel homeViewModelCopy;
        @Override
        public void displayHomeMetaData(HomeViewModel homeViewModel) {
            isdisplayHomeMetaDataCalled = true;
            homeViewModelCopy = homeViewModel;
        }
    }
}