package im.adamant.android.ui;

import android.content.Intent;
import android.graphics.Paint;
import android.os.Bundle;
import android.widget.Toast;

import androidx.core.content.ContextCompat;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;

import com.google.android.material.button.MaterialButton;
import com.yarolegovich.discretescrollview.DiscreteScrollView;

import javax.inject.Inject;

import butterknife.BindView;
import butterknife.OnClick;
import dagger.android.AndroidInjection;
import dagger.android.AndroidInjector;
import dagger.android.DispatchingAndroidInjector;
import dagger.android.support.HasSupportFragmentInjector;
import im.adamant.android.Constants;
import im.adamant.android.R;
import im.adamant.android.Screens;
import im.adamant.android.interactors.AuthorizeInteractor;
import im.adamant.android.ui.adapters.WelcomeCardsAdapter;
import im.adamant.android.ui.custom_view.SimpleDotIndicatorDecoration;
import im.adamant.android.ui.fragments.BottomLoginFragment;
import im.adamant.android.ui.navigators.DefaultNavigator;
import ru.terrakok.cicerone.Navigator;
import ru.terrakok.cicerone.NavigatorHolder;
import ru.terrakok.cicerone.commands.Back;
import ru.terrakok.cicerone.commands.BackTo;
import ru.terrakok.cicerone.commands.Command;
import ru.terrakok.cicerone.commands.Forward;
import ru.terrakok.cicerone.commands.Replace;
import ru.terrakok.cicerone.commands.SystemMessage;


public class LoginScreen extends BaseActivity implements HasSupportFragmentInjector {

    @Inject
    WelcomeCardsAdapter adapter;

    @Inject
    NavigatorHolder navigatorHolder;

    @Inject
    DispatchingAndroidInjector<Fragment> fragmentDispatchingAndroidInjector;

    @Inject
    AuthorizeInteractor authorizeInteractor;

    @BindView(R.id.activity_login_vp_welcome_cards) DiscreteScrollView welcomeCardsSliderView;
    @BindView(R.id.activity_login_btn_generate_new_passphrase) MaterialButton creteNewButtonView;

    private BottomLoginFragment loginFragment;

    public static final String BOTTOM_LOGIN_TAG = "BottomLogin";

    //--Activity
    @Override
    public int getLayoutId() {
        return R.layout.activity_login_screen;
    }

    @Override
    public boolean withBackButton() {
        return false;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        AndroidInjection.inject(this);
        if (authorizeInteractor.isAuthorized()) {
            navigator.applyCommands(new Command[]{
                    new Forward(Screens.WALLET_SCREEN, null)
            });
        }
        super.onCreate(savedInstanceState);

        loginFragment = (BottomLoginFragment) getSupportFragmentManager().findFragmentByTag(BOTTOM_LOGIN_TAG);

        if (loginFragment == null) {
            loginFragment = new BottomLoginFragment();
        }

        welcomeCardsSliderView.setAdapter(adapter);
        welcomeCardsSliderView.setOffscreenItems(1);
        welcomeCardsSliderView.setOverScrollEnabled(true);
        welcomeCardsSliderView.addItemDecoration(
                new SimpleDotIndicatorDecoration(
                        ContextCompat.getColor(this, R.color.secondaryDarkVariant),
                        ContextCompat.getColor(this, R.color.secondaryLightVariant),
                        20
                )
        );

        creteNewButtonView.setPaintFlags(creteNewButtonView.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
    }

    @OnClick(R.id.activity_login_ib_node_list)
    public void showNodesList() {
        Intent intent = new Intent(getApplicationContext(), NodesListScreen.class);
        startActivity(intent);
    }

    @OnClick(R.id.activity_login_btn_login)
    public void loginButtonClick() {
        FragmentManager supportFragmentManager = getSupportFragmentManager();
        Fragment fragment = supportFragmentManager.findFragmentByTag(BOTTOM_LOGIN_TAG);
        if (fragment == null) {
            loginFragment.show(supportFragmentManager, BOTTOM_LOGIN_TAG);
        }
    }

    @OnClick(R.id.activity_login_btn_generate_new_passphrase)
    public void generateNewPassphraseClick() {
        Intent intent = new Intent(getApplicationContext(), RegistrationScreen.class);
        startActivity(intent);
    }

    @Override
    protected void onResume() {
        super.onResume();
        navigatorHolder.setNavigator(navigator);
    }

    @Override
    protected void onPause() {
        super.onPause();
        navigatorHolder.removeNavigator();
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (loginFragment != null){
            loginFragment.onActivityResult(requestCode, resultCode, data);
        }
    }

    @Override
    public AndroidInjector<Fragment> supportFragmentInjector() {
        return fragmentDispatchingAndroidInjector;
    }

    private Navigator navigator = new DefaultNavigator(this) {
        @Override
        protected void forward(Forward forwardCommand) {
            switch (forwardCommand.getScreenKey()){
                case Screens.SETTINGS_SCREEN:
                case Screens.WALLET_SCREEN:
                case Screens.CHATS_SCREEN: {
                    Bundle bundle = new Bundle();
                    bundle.putString(MainScreen.ARG_CURRENT_SCREEN, forwardCommand.getScreenKey());

                    Intent intent = new Intent(getApplicationContext(), MainScreen.class);
                    intent.putExtras(bundle);

                    startActivity(intent);
                    finish();
                }
                break;
                case Screens.SCAN_QRCODE_SCREEN: {
                    Intent intent = new Intent(getApplicationContext(), ScanQrCodeScreen.class);
                    startActivityForResult(intent, Constants.SCAN_QR_CODE_RESULT);
                }
                break;
                case Screens.SPLASH_SCREEN: {
                    Intent intent = new Intent(getApplicationContext(), SplashScreen.class);
                    startActivity(intent);
                    finish();
                }
                break;
            }
        }

        @Override
        protected void back(Back backCommand) {

        }

        @Override
        protected void backTo(BackTo backToCommand) {

        }

        @Override
        protected void message(SystemMessage systemMessageCommand) {
            Toast.makeText(getApplicationContext(), systemMessageCommand.getMessage(), Toast.LENGTH_LONG).show();
        }

        @Override
        protected void replace(Replace replaceCommand) {

        }
    };


}