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


import android.content.DialogInterface;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.DialogFragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.util.Log;

import edu.whs.spin2018.baoapp.R;
import edu.whs.spin2018.baoapp.model.Benutzer;

public abstract class HerausforderungsDialog extends DialogFragment {

    /**
     * Gibt an wie lange es dauern soll, bis sich der Dialog nach dem Annehmen der Ablehnen der
     * gesendeten Herausforderung schließt.
     */
    public static final int DIALOG_SCHLIESSEN_VERZOEGERUNG = 1300;
    public static final String TAG = "HerausforderungTAG";
    private OnActionHappenedListener mOnActionHappenedListener;

    /**
     * Parameter, die dem Fragment von der aufrufenden Aktivität uebergeben wurden.
     */

    public HerausforderungsDialog() {
        //benötigter leerer Standardkonstruktor
    }

    public void setzeOnActionHappenedListener(OnActionHappenedListener onActionHappenedListener) {
        this.mOnActionHappenedListener = onActionHappenedListener;
    }

    public OnActionHappenedListener gibOnActionHappenedListener() {
        return mOnActionHappenedListener;
    }

    /**
     * Zeigt an, dass die aktuelle Herausforderung abgebrochen oder abgelehnt wurde.
     */
    public abstract void zeigeHerausforderungBeendet();


    public abstract void zeigeHerausforderungAngenommen();

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setStyle(DialogFragment.STYLE_NO_TITLE, R.style.DialogAbgerundeteEcken);
    }

    public abstract String gibGegnerUUID();

    @Override
    public void onCancel(DialogInterface dialog) {
        super.onCancel(dialog);
        this.mOnActionHappenedListener.onDialogCanceled(gibGegnerUUID());
        Log.d(TAG, "onCancel: ");
    }

    @Override
    public void onPause() {
        super.onPause();
//        mOnActionHappenedListener.onHerausforderungAblehnenClicked(gibGegnerUUID());
//        dismissAllowingStateLoss();
//        Log.d(TAG, "onPause: ");
    }

    @Override
    public void onDismiss(DialogInterface dialog) {
        super.onDismiss(dialog);
        Log.d(TAG, "onDismiss: Dialog dismissed");
    }

    @Override
    public void onSaveInstanceState(@NonNull Bundle outState) {
        super.onSaveInstanceState(outState);
        Log.d(TAG, "onSaveInstanceState: Dialog saved");
    }

    @Override
    public void show(FragmentManager manager, String tag) {
        FragmentTransaction ft = manager.beginTransaction();
        ft.add(this, tag);
        ft.commitAllowingStateLoss();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "onDestroy: Dialog destroyed");
    }

    /**
     * Interface zur Weiterleitung einer Aktion (Button geklickt, Dialog gecanceld) an die Activity
     */
    public interface OnActionHappenedListener {

        /**
         * Wird aufgerufen, wenn der Dialog durch etwas anderes als einen Button - Klick beendet
         * wird
         *
         * @param gegnerUUID - uuid des Gegners
         */
        void onDialogCanceled(String gegnerUUID);

        /**
         * Wird aufgerufen, wenn der Dialog durch einen Button - Klick beendet wird.
         */
        void onDialogBeendet();

        /**
         * Lehnt die eingegangede Herausforderung ab und schließt den Dialog.
         */
        void onHerausforderungAblehnenClicked(String gegnerUUID);

        /**
         * Wird aufgerufen, wenn der Empaenger die Herausforderung annimmt.
         */
        void onHerausforderungAngenommenClicked(String gegnerUUID);

        /**
         * Wird aufgerufen, wenn der Absender die Herausforderung abbricht.
         */
        void onHerausforderungAbbrechenClicked(String gegnerUUID);

        /**
         * Startet die Spieleinstellungen
         *
         * @param gegner - Daten des Gegners
         * @param raum   - Raum
         */
        void starteSpieleinstellungen(Benutzer gegner, String raum);
    }
}
