package com.ahanapharmacy.app.activities;

import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.design.widget.FloatingActionButton;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.animation.OvershootInterpolator;
import android.webkit.WebView;

import com.ahanapharmacy.app.App;
import com.ahanapharmacy.app.R;
import com.ahanapharmacy.app.Utils.Analytics;
import com.ahanapharmacy.app.adapters.OrdersAdapter;
import com.ahanapharmacy.app.messaging.MyInstanceIdService;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GoogleApiAvailability;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.analytics.FirebaseAnalytics;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.remoteconfig.FirebaseRemoteConfig;

import butterknife.ButterKnife;
import jp.wasabeef.recyclerview.animators.SlideInRightAnimator;
import timber.log.Timber;

/**
 * An activity representing a list of Orders. This activity
 * has different presentations for handset and tablet-size devices. On
 * handsets, the activity presents a list of items, which when touched,
 * lead to a {@link OrderDetailActivity} representing
 * item details. On tablets, the activity presents the list of items and
 * item details side-by-side using two vertical panes.
 */
public class OrderListActivity extends AppCompatActivity implements OrdersAdapter.OnOrderClickListener{

    public final String TAG = this.getClass().getSimpleName();
    private FirebaseRemoteConfig mRemoteConfig;
    private FirebaseAnalytics mAnalytics;

    private AlertDialog mAlertDialog;
    /**
     * Whether or not the activity is in two-pane mode, i.e. running on a tablet
     * device.
     */
    private boolean mTwoPane;

    private OrdersAdapter mOrdersAdapter;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        mRemoteConfig = FirebaseRemoteConfig.getInstance();
        mAnalytics = FirebaseAnalytics.getInstance(this);

        mRemoteConfig.setDefaults(R.xml.remote_config_defaults);

        mRemoteConfig.fetch(2000)
                .addOnCompleteListener(new OnCompleteListener<Void>() {
                    @Override
                    public void onComplete(@NonNull Task<Void> task) {
                        mRemoteConfig.activateFetched();
                    }
                });

        // Check if user logged in else go back to login activity
        if (FirebaseAuth.getInstance().getCurrentUser() == null) {
            startActivity(LoginActivity.getInstance(this));
            finish();
            return;
        }

        setContentView(R.layout.activity_order_list);
        ButterKnife.bind(this);

        if (checkPlayServices()) {
            // Start IntentService to  register this application with GCM
            Intent intent = new Intent(this, MyInstanceIdService.class);
            startService(intent);
        }

        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                startActivity(NewOrderActivity.getInstance(OrderListActivity.this));

               /* BottomSheetDialogFragment bottomSheetDialogFragment = new NewOrderFragment();
                if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
                    Fade explode = new Fade();
                    explode.setDuration(1000);
                    bottomSheetDialogFragment.setEnterTransition(explode);
                }

                bottomSheetDialogFragment.show(getSupportFragmentManager(), bottomSheetDialogFragment.getTag());*/

            }
        });

        RecyclerView recyclerView = (RecyclerView) findViewById(R.id.order_list);
        assert recyclerView != null;
       // setupRecyclerView((RecyclerView) recyclerView);
        mOrdersAdapter = new OrdersAdapter(recyclerView, this);

        // Set item animator
        // Set animator
        SlideInRightAnimator slideAnimator = new SlideInRightAnimator(new OvershootInterpolator(0.5f));
        slideAnimator.setAddDuration(300);
        slideAnimator.setRemoveDuration(300);
        slideAnimator.setChangeDuration(300);
        slideAnimator.setMoveDuration(300);
        recyclerView.setItemAnimator(slideAnimator);

        recyclerView.setAdapter(mOrdersAdapter);

/*        if (mOrdersAdapter.getItemCount() < 1) {
            emptyTextView.setVisibility(View.VISIBLE);
            recyclerView.setVisibility(View.GONE);
        } else {
            emptyTextView.setVisibility(View.GONE);
            recyclerView.setVisibility(View.VISIBLE);
        }*/

        if (findViewById(R.id.order_detail_container) != null) {
            // The detail container view will be present only in the
            // large-screen layouts (res/values-w900dp).
            // If this view is present, then the
            // activity should be in two-pane mode.
            mTwoPane = true;
        }
    }

    @Override
    public void onOrderClick(String orderPath) {
        if (mTwoPane) {
            Bundle arguments = new Bundle();
            arguments.putString(OrderDetailFragment.ORDER_PATH, orderPath);
            OrderDetailFragment fragment = new OrderDetailFragment();
            fragment.setArguments(arguments);
            getSupportFragmentManager().beginTransaction()
                    .replace(R.id.order_detail_container, fragment)
                    .commit();
        } else {

            startActivity(OrderDetailActivity.getInstance(this, orderPath));

        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_order_list, menu);

        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        switch (item.getItemId()) {
            case R.id.action_settings:
                startActivity(EditUserActivity.getInstance(this));
                break;
            case R.id.action_logout:
                App.logout();
                startActivity(LoginActivity.getInstance(this));
                Bundle params = new Bundle();
                FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
                if (user != null) {

                    params.putString(Analytics.Param.USER_ID, user.getUid());
                    params.putString(Analytics.Param.USER_NAME, user.getDisplayName());
                    params.putString(FirebaseAnalytics.Param.VALUE, user.getUid());

                }
                mAnalytics.logEvent(Analytics.Event.LOGOUT, params);
                finish();
                return false;
            case R.id.action_about:
                startActivity(AboutPage.getInstance(this));
                break;
            case R.id.action_licenses:
                displayLicensesAlertDialog();
                break;

        }
        return super.onOptionsItemSelected(item);
    }

    public static Intent getInstance(Context context) {
        return new Intent(context, OrderListActivity.class);
    }

    @Override
    protected void onDestroy() {
        // Clean up child listener
        mOrdersAdapter.cleanUp();
        super.onDestroy();
    }

    // Displays licenses
    private void displayLicensesAlertDialog() {
        WebView view = (WebView) LayoutInflater.from(this).inflate(R.layout.dialog_licenses, null);
        view.loadUrl("file:///android_asset/open_source_licenses.html");
        mAlertDialog = new AlertDialog.Builder(this, R.style.Theme_AppCompat_Light_Dialog_Alert)
                .setTitle(getString(R.string.action_licenses))
                .setView(view)
                .setPositiveButton(android.R.string.ok, null)
                .show();
    }


    /**
     * Check the device to make sure it has the Google Play Services APK. If
     * it doesn't, display a dialog that allows users to download the APK from
     * the Google Play Store or enable it in the device's system settings.
     */
    private boolean checkPlayServices() {
        final int PLAY_SERVICES_RESOLUTION_REQUEST = 9002;

        GoogleApiAvailability apiAvailability = GoogleApiAvailability.getInstance();
        int resultCode = apiAvailability.isGooglePlayServicesAvailable(this);
        if (resultCode != ConnectionResult.SUCCESS) {
            if (apiAvailability.isUserResolvableError(resultCode)) {
                apiAvailability.getErrorDialog(this, resultCode, PLAY_SERVICES_RESOLUTION_REQUEST)
                        .show();
            } else {
                Timber.i("Play services: This device is not supported.");
                finish();
            }
            return false;
        }
        return true;
    }

}