package edu.whs.spin2018.baoapp.views.menues;

import android.content.ComponentName;
import android.content.Intent;
import android.os.IBinder;
import android.support.v7.app.AlertDialog;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView;

import java.util.Timer;
import java.util.TimerTask;

import edu.whs.spin2018.baoapp.R;
import edu.whs.spin2018.baoapp.model.Benutzer;
import edu.whs.spin2018.baoapp.presenter.MehrspielerPresenter;
import edu.whs.spin2018.baoapp.service.BaoService;
import edu.whs.spin2018.baoapp.service.Konstanten;
import edu.whs.spin2018.baoapp.model.remote.mehrspieler.MehrspielerRemoteDataSource;
import edu.whs.spin2018.baoapp.model.remote.mehrspieler.MehrspielerServiceInteractor;
import edu.whs.spin2018.baoapp.utilities.SharedPrefUtils;
import edu.whs.spin2018.baoapp.utilities.ViewUtils;
import edu.whs.spin2018.baoapp.views.OnlineActivity;
import edu.whs.spin2018.baoapp.views.lobby.LobbyActivity;
import edu.whs.spin2018.baoapp.views.spiel.BaoSpielActivity;

/**
 * Activity zum Auswaehlen eines Mehrspielermoduses.
 */
public class MehrspielerActivity extends OnlineActivity implements MehrspielerContract.View {

    public static final int DIALOG_SCHLIESSEN_VERZOEGERUNG = 1500;
    private MehrspielerContract.Presenter mehrspielerPresenter;
    private AlertDialog schnellspielDialog;
    private TextView schnellspiel_status;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(edu.whs.spin2018.baoapp.R.layout.activity_mehrspieler);

        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

        TextView mTextViewMehrspielerHeading = findViewById(edu.whs.spin2018.baoapp.R.id.mehrspieler_heading);
        Button mButtonSchnellspiel = findViewById(edu.whs.spin2018.baoapp.R.id.mehrspieler_btn_schnellspiel);
        Button mButtonLobby = findViewById(edu.whs.spin2018.baoapp.R.id.mehrspieler_btn_lobby);
        Button mButtonLokalesSpiel = findViewById(edu.whs.spin2018.baoapp.R.id.mehrspieler_btn_lokales_spiel);

        ViewUtils.setzeSchatten(mTextViewMehrspielerHeading);
        ViewUtils.setzeSchatten(mButtonSchnellspiel);
        ViewUtils.setzeSchatten(mButtonLobby);
        ViewUtils.setzeSchatten(mButtonLokalesSpiel);

        mehrspielerPresenter = new MehrspielerPresenter(this);
        this.setzePresenter(mehrspielerPresenter);

        mButtonSchnellspiel.setOnClickListener(v -> {
            mehrspielerPresenter.starteSchnellspielSuche();
        });

        mButtonLobby.setOnClickListener(v -> {
            Intent oeffneLobby = new Intent(this, LobbyActivity.class);
            startActivity(oeffneLobby);
        });

        mButtonLokalesSpiel.setOnClickListener(v -> {
            Intent oeffneLokalesSpiel = new Intent(this,
                    LokaleSpieleinstellungenActivity.class);
            startActivity(oeffneLokalesSpiel);
        });
    }


    @Override
    public void initView() {

    }

    @Override
    public void setzePresenter(MehrspielerContract.Presenter presenter) {
        this.mehrspielerPresenter = presenter;
    }

    @Override
    public void beendeSchnellspielDialog() {
        schnellspielDialog.dismiss();
    }

    @Override
    public void zeigeGegnerSuche() {
        AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this);
        LayoutInflater inflater = this.getLayoutInflater();
        View schnellspielView = inflater.inflate(R.layout.dialog_schnellspiel, null);
        schnellspielView.setBackground(getDrawable(R.drawable.background_rounded_corners_light_brownish));
        dialogBuilder.setView(schnellspielView);
        ImageView schnellspiel_nicht_gefunden = schnellspielView.findViewById(R.id.iv_schnellspiel_nicht_gefunden);
        schnellspiel_nicht_gefunden.setVisibility(View.INVISIBLE);
        ImageView schnellspiel_gefunden = schnellspielView.findViewById(R.id.iv_schnellspiel_gefunden);
        schnellspiel_gefunden.setVisibility(View.INVISIBLE);
        schnellspiel_status = schnellspielView.findViewById(R.id.tv_schnellspiel_status);
        Button abbrechen = schnellspielView.findViewById(R.id.btn_schnellspiel_abbrechen);
        ViewUtils.setzeSchatten(abbrechen);
        abbrechen.setOnClickListener(view -> mehrspielerPresenter.beendeSchnellspielSuche());
        runOnUiThread(() -> schnellspielDialog = dialogBuilder.create());
        runOnUiThread(() -> schnellspielDialog.show());
    }

    @Override
    public void zeigeGegnerGefunden() {
        ProgressBar spielersuche = schnellspielDialog.findViewById(R.id.pb_schnellspiel_warten);
        runOnUiThread(() -> spielersuche.setVisibility(View.INVISIBLE));
        runOnUiThread(() -> schnellspiel_status.setText(getString(R.string.gegner_wurde_gefunden)));
        runOnUiThread(() -> new Timer().schedule(new TimerTask() {
            @Override
            public void run() {

            }
        }, DIALOG_SCHLIESSEN_VERZOEGERUNG));
    }

    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        Log.i("BaoService", "Service bound");
        BaoService baoServiceInterface = ((BaoService.LocalBinder) service).getService();
        MehrspielerRemoteDataSource serviceInteractor = new MehrspielerServiceInteractor(
                baoServiceInterface,
                new Benutzer(SharedPrefUtils.gibBenutzername(this),
                        SharedPrefUtils.gibUUID(this)));
        mehrspielerPresenter.setzeServiceInteractor(serviceInteractor);
    }

    @Override
    public void onServiceDisconnected(ComponentName name) {

    }

    @Override
    protected void onPause() {
        super.onPause();
        if (schnellspielDialog != null) {
            schnellspielDialog.dismiss();
        }
    }

    @Override
    public void starteSpiel(Benutzer gegner, String raum) {
        Intent spielInformationen = new Intent(this, BaoSpielActivity.class);

        spielInformationen.putExtra(Konstanten.EXTRA_SPIELTYP, Konstanten.SPIELTYP_MEHRSPIELER);
        spielInformationen.putExtra(Konstanten.EXTRA_SPIELMODUS, Konstanten.SPIELZEIT_OHNE_ZEIT);
        spielInformationen.putExtra(Konstanten.EXTRA_GEGNER_NAME, gegner.gibBenutzernamen());
        spielInformationen.putExtra(Konstanten.EXTRA_RAUM, raum);

        startActivity(spielInformationen);
    }
}
