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


import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.DialogFragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
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.utilities.SharedPrefUtils;
import edu.whs.spin2018.baoapp.utilities.ViewUtils;

/**
 * A simple {@link DialogFragment} subclass. Use the {@link HerausforderungAusgehendDialog#newInstance}
 * factory method to create an instance of this fragment.
 */
public class HerausforderungAusgehendDialog extends HerausforderungsDialog {

    /**
     * Parameter, die dem Fragment von der aufrufenden Aktivität uebergeben wurden.
     */
    private static final String ARG_BENUTZERNAME = "gegnerBenutzername";
    private static final String ARG_UUID = "uuid";

    /*
     * Werden benutzt um den Status der Herausforderung anzuzeigen
     */
    private ProgressBar mWarteAnzeige;
    private ImageView mAbgelehntAnzeige;
    private ImageView mAngenommenAnzeige;
    private TextView mHerausforderungStatus;
    private Button mBtnAbbrechen;


    private String gegnerBenutzername;
    private String gegnerUUID;

    public HerausforderungAusgehendDialog() {
        // benötigter leerer Standtardkonstruktor
    }

    /**
     * Use this factory method to create a new instance of this fragment using the provided
     * parameters.
     *
     * @param gegnerBenutzername Benutzername des Herausgeforderten
     * @param gegnerUUID         gegnerUUID des Herausgeforderten
     * @return eine neue Instanz des Fragments HerausforderungAusgehendDialog.
     */
    public static HerausforderungAusgehendDialog newInstance(String gegnerBenutzername, String gegnerUUID) {
        HerausforderungAusgehendDialog fragment = new HerausforderungAusgehendDialog();
        Bundle args = new Bundle();
        args.putString(ARG_BENUTZERNAME, gegnerBenutzername);
        args.putString(ARG_UUID, gegnerUUID);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void zeigeHerausforderungBeendet() {
        //Anzeige aktualisieren
        mAngenommenAnzeige.setVisibility(View.INVISIBLE);
        mWarteAnzeige.setVisibility(View.INVISIBLE);
        mAbgelehntAnzeige.setVisibility(View.VISIBLE);
        mHerausforderungStatus.setVisibility(View.VISIBLE);
        mHerausforderungStatus.setText(R.string.herausforderung_abgelehnt);

        new Timer().schedule(new TimerTask() {
            @Override
            public void run() {
                dismissAllowingStateLoss();
                gibOnActionHappenedListener().onDialogBeendet();
            }
        }, DIALOG_SCHLIESSEN_VERZOEGERUNG);
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
            gegnerBenutzername = getArguments().getString(ARG_BENUTZERNAME);
            gegnerUUID = getArguments().getString(ARG_UUID);
        }
    }

    /**
     * Hier wird die View, welche für den Dialog gesetzt werden soll, geladen.
     *
     * @param inflater           - dient zum umwandeln des XML Layouts in das View Objekt
     * @param container
     * @param savedInstanceState - dient zum Herstellen des vorherigen Zustands der View
     * @return Liefert die View zurück.
     */
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        Log.d(TAG, "onCreateView: ");
        View v = inflater.inflate(R.layout.dialog_herausforderung_ausgehend,
                container, false);

        mAbgelehntAnzeige = v.findViewById(R.id.iv_herausforderung_abgelehnt);
        mAngenommenAnzeige = v.findViewById(R.id.iv_herausforderung_angenommen);
        mWarteAnzeige = v.findViewById(R.id.pb_warten);
        mHerausforderungStatus = v.findViewById(R.id.tv_herausforderung_status);

        TextView tvTitel = v.findViewById(R.id.tv_herausforderung_ausgehend_label);
        mBtnAbbrechen = v.findViewById(R.id.btn_herausforderung_ausgehend_abbrechen);
        ViewUtils.setzeSchatten(mBtnAbbrechen);

        tvTitel.setText(String.format(getString(R.string.ausgehende_herausforderung_label),
                gegnerBenutzername));

        //Listener zum Abbrechen der Herausforderung
        mBtnAbbrechen.setOnClickListener(view -> {
            gibOnActionHappenedListener()
                    .onHerausforderungAbbrechenClicked(gegnerUUID);
            dismissAllowingStateLoss();
        });

        return v;
    }

    @Override
    public String gibGegnerUUID() {
        return gegnerUUID;
    }

    @Override
    public void zeigeHerausforderungAngenommen() {
        mAbgelehntAnzeige.setVisibility(View.INVISIBLE);
        mWarteAnzeige.setVisibility(View.INVISIBLE);
        mAngenommenAnzeige.setVisibility(View.VISIBLE);
        mHerausforderungStatus.setText(R.string.herausforderung_angenommen);
        mBtnAbbrechen.setActivated(false);
        mBtnAbbrechen.setClickable(false);

        String meineUUID = SharedPrefUtils.gibUUID(getActivity());

        new Timer().schedule(new TimerTask() {
            @Override
            public void run() {
                gibOnActionHappenedListener()
                        .starteSpieleinstellungen(new Benutzer(gegnerBenutzername, gegnerUUID),
                                meineUUID);
                dismissAllowingStateLoss();
            }
        }, DIALOG_SCHLIESSEN_VERZOEGERUNG);
    }
}
