package rajan.udacity.stock.hawk.ui.main;

import com.afollestad.materialdialogs.MaterialDialog;
import com.afollestad.materialdialogs.Theme;

import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.helper.ItemTouchHelper;
import android.text.InputType;
import android.view.Gravity;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.List;

import javax.inject.Inject;

import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import rajan.udacity.stock.hawk.R;
import rajan.udacity.stock.hawk.data.SyncService;
import rajan.udacity.stock.hawk.data.model.Quote;
import rajan.udacity.stock.hawk.touch_helper.SimpleItemTouchHelperCallback;
import rajan.udacity.stock.hawk.ui.base.BaseActivity;
import rajan.udacity.stock.hawk.ui.stockgraph.StockGraphActivity;
import rajan.udacity.stock.hawk.util.Constants;
import rajan.udacity.stock.hawk.util.DialogFactory;
import rajan.udacity.stock.hawk.util.NetworkUtil;

public class MainActivity extends BaseActivity implements
        MainMvpView, StockAdapter.DismissAndOnClickItemStockListener {

    private static final String EXTRA_TRIGGER_SYNC_FLAG =
            "rajan.udacity.stock.hawk.ui.main.MainActivity.EXTRA_TRIGGER_SYNC_FLAG";

    @Inject
    MainPresenter mMainPresenter;

    @Inject
    StockAdapter mStocksAdapter;

    @BindView(R.id.recycler_view)
    RecyclerView mRecyclerView;

    /**
     * Return an Intent to start this Activity.
     * triggerDataSyncOnCreate allows disabling the background sync service onCreate. Should
     * only be set to false during testing.
     */
    public static Intent getStartIntent(Context context, boolean triggerDataSyncOnCreate) {
        Intent intent = new Intent(context, MainActivity.class);
        intent.putExtra(EXTRA_TRIGGER_SYNC_FLAG, triggerDataSyncOnCreate);
        return intent;
    }

    @Override
    public void onItemClick(String symbol) {
        Intent intent = new Intent(this, StockGraphActivity.class);
        intent.putExtra(Constants.SYMBOL, symbol);
        startActivity(intent);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        activityComponent().inject(this);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);

        mRecyclerView.setAdapter(mStocksAdapter);
        mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
        mStocksAdapter.setOnDismissStockListener(this);
        mMainPresenter.attachView(this);
        mMainPresenter.loadStocks();

        ItemTouchHelper.Callback callback = new SimpleItemTouchHelperCallback(mStocksAdapter);
        ItemTouchHelper itemTouchHelper = new ItemTouchHelper(callback);
        itemTouchHelper.attachToRecyclerView(mRecyclerView);

        if (getIntent().getBooleanExtra(EXTRA_TRIGGER_SYNC_FLAG, true)) {
            startService(SyncService.getStartIntent(this));
        }
    }

    @Override
    protected void onStart() {
        super.onStart();
        mMainPresenter.loadChangeInPercent();
    }

    @OnClick(R.id.fb_add_stock)
    void onClickAddStock() {
        if (NetworkUtil.isNetworkConnected(this)) {
            showMaterialDialogAddStock();
        } else {
            Toast.makeText(this, getResources().getString(R.string.network_toast),
                    Toast.LENGTH_SHORT).show();
        }
    }


    @Override
    public void onStockDismiss(String symbol) {
        mMainPresenter.deleteStock(symbol);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mMainPresenter.detachView();
    }

    /***** MVP View methods implementation *****/

    @Override
    public void showStocks(List<Quote> stocks) {
        mStocksAdapter.setStocks(stocks);
        mStocksAdapter.notifyDataSetChanged();
    }

    @Override
    public void showError() {
        DialogFactory.createGenericErrorDialog(this, getString(R.string.error_loading_stocks))
                .show();
    }

    @Override
    public void showStocksEmpty() {
        List<Quote> quotes = new ArrayList<>();
        mStocksAdapter.setStocks(quotes);
        mStocksAdapter.notifyDataSetChanged();
        Toast.makeText(this, R.string.empty_stocks, Toast.LENGTH_LONG).show();
    }

    @Override
    public void showStock(Quote quote) {
        mStocksAdapter.setStock(quote);
    }

    @Override
    public void showStockDoesNotExist() {
        Toast toast = Toast.makeText(this, getResources().getString(R.string.stock_does_not_exist),
                Toast.LENGTH_LONG);
        toast.setGravity(Gravity.CENTER, Gravity.CENTER, 0);
        toast.show();
    }

    @Override
    public void showMaterialDialogAddStock() {
        new MaterialDialog.Builder(this).title(R.string.symbol_search)
                .content(R.string.content_test)
                .positiveColorRes(R.color.white)
                .positiveColor(Color.WHITE)
                .theme(Theme.DARK)
                .backgroundColorRes(R.color.material_blue_grey_800)
                .inputType(InputType.TYPE_CLASS_TEXT)
                .input(R.string.input_hint, R.string.input_prefill,
                        new MaterialDialog.InputCallback() {
                            @Override
                            public void onInput(MaterialDialog dialog, CharSequence input) {
                                // On FAB click, receive user input. Make sure the stock doesn't
                                // already exist in the DB and proceed accordingly
                                if (checkSymbolExistOrNot(input.toString(),
                                        mStocksAdapter.getStocks())) {
                                    showStockAlreadyExist();
                                } else if (!input.toString().isEmpty()) {
                                    mMainPresenter.loadStock(input.toString());
                                }
                            }
                        })
                .show();
    }

    @Override
    public Boolean checkSymbolExistOrNot(String symbol, List<Quote> stock) {
        return mMainPresenter.checkStocksExistOrNot(symbol, stock);
    }

    @Override
    public void showStockAlreadyExist() {
        Toast toast = Toast.makeText(this, getResources().getString(R.string.stocks_already_exist),
                Toast.LENGTH_LONG);
        toast.setGravity(Gravity.CENTER, Gravity.CENTER, 0);
        toast.show();
    }

    @Override
    public void showChangeInPercent(Boolean changeInPercent) {
        mStocksAdapter.setChangeInPercent(changeInPercent);
    }

    @Override
    public void updateChangeInPercent(Boolean changeInPercent) {
        mStocksAdapter.setChangeInPercent(changeInPercent);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        if (id == R.id.action_change_units) {
            mMainPresenter.updateChangeInPercent();
        }

        return super.onOptionsItemSelected(item);
    }
}