package com.imagepicker.testing;

import android.app.Activity;
import android.content.pm.PackageManager;
import android.net.Uri;

import com.facebook.react.bridge.Arguments;
import com.facebook.react.bridge.Callback;
import com.facebook.react.bridge.JavaOnlyArray;
import com.facebook.react.bridge.JavaOnlyMap;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.common.build.ReactBuildConfig;
import com.imagepicker.ImagePickerModule;
import com.imagepicker.R;

import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PowerMockIgnore;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.core.classloader.annotations.SuppressStaticInitializationFor;
import org.powermock.modules.junit4.rule.PowerMockRule;
import org.robolectric.Robolectric;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.android.controller.ActivityController;
import org.robolectric.annotation.Config;

import java.io.File;

import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertNotNull;
import static junit.framework.Assert.assertTrue;
import static org.powermock.api.mockito.PowerMockito.mock;
import static org.powermock.api.mockito.PowerMockito.when;

/**
 * Created by rusfearuth on 10.04.17.
 */

@RunWith(RobolectricTestRunner.class)
@SuppressStaticInitializationFor("com.facebook.react.common.build.ReactBuildConfig")
@PrepareForTest({Arguments.class})
@PowerMockIgnore({"org.mockito.*", "org.robolectric.*", "android.*"})
@Config(manifest = Config.NONE)
public class ImagePickerModuleTest
{
    private static final int DEFAULT_THEME = R.style.DefaultExplainingPermissionsTheme;

    @Rule
    public PowerMockRule rule = new PowerMockRule();

    private ActivityController<Activity> activityController;
    private Activity activity;
    private ReactApplicationContext reactContext;

    private TestableImagePickerModule module;

    @Before
    public void setUp() throws Exception
    {
        nativeMock();

        activityController = Robolectric.buildActivity(Activity.class);
        activity = activityController.create().start().resume().get();
        reactContext = mock(ReactApplicationContext.class);

        module = new TestableImagePickerModule(reactContext, DEFAULT_THEME);
        assertNotNull("Module was created", module);
        when(reactContext.getCurrentActivity()).thenReturn(activity);
    }



    @After
    public void tearDown()
    {
        activityController.pause().stop().destroy();
        activity = null;
    }


    @Test
    public void testCancelTakingPhoto()
    {
        final SampleCallback callback = new SampleCallback();
        module.setCallback(callback);
        module.setCameraCaptureUri(Uri.fromFile(new File("")));
        module.onActivityResult(activity, ImagePickerModule.REQUEST_LAUNCH_IMAGE_CAPTURE, Activity.RESULT_CANCELED, null);
        assertFalse("Camera's been launched", callback.hasError());
        assertTrue("User's cancelled of taking a photo", callback.didCancel());
    }

    private void nativeMock()
    {
        PowerMockito.mockStatic(Arguments.class);
        when(Arguments.createArray()).thenAnswer(new Answer<Object>() {
            @Override
            public Object answer(InvocationOnMock invocation) throws Throwable {
                return new JavaOnlyArray();
            }
        });
        when(Arguments.createMap()).thenAnswer(new Answer<Object>() {
            @Override
            public Object answer(InvocationOnMock invocation) throws Throwable {
                return new JavaOnlyMap();
            }
        });
    }
}