package com.sonelli.portknocker.adapters;

import android.content.Context;
import android.support.v4.app.FragmentActivity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageButton;
import android.widget.ListAdapter;
import android.widget.Spinner;
import android.widget.TextView;

import com.doomonafireball.betterpickers.numberpicker.NumberPickerBuilder;
import com.doomonafireball.betterpickers.numberpicker.NumberPickerDialogFragment;
import com.sonelli.portknocker.R;
import com.sonelli.portknocker.models.KnockItem;
import com.sonelli.portknocker.models.KnockSequence;

import java.lang.ref.WeakReference;

public class KnockSequenceListAdapter extends BaseAdapter implements ListAdapter {

    private WeakReference<FragmentActivity> activity;
    private KnockSequence sequence;
    private LayoutInflater inflater;

    public KnockSequenceListAdapter(FragmentActivity activity, KnockSequence sequence) {
        this.activity = new WeakReference<FragmentActivity>(activity);
        this.sequence = sequence;
        this.inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    public void save() {
        sequence.save(activity.get());
        notifyDataSetChanged();
    }

    @Override
    public int getCount() {
        return sequence.size() + 1;
    }

    @Override
    public KnockItem getItem(int position) {
        if (sequence.size() < (position + 1)) {
            KnockItem item = new KnockItem();
            sequence.add(position, item);
            return item;
        } else {
            return sequence.get(position);
        }
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {

        final FragmentActivity context = activity.get();
        if (context == null)
            return null;

        if (convertView == null) {
            convertView = inflater.inflate(R.layout.knock_item, parent, false);
        }

        final Spinner type = (Spinner) convertView.findViewById(R.id.type_spinner);
        final TextView value = (TextView) convertView.findViewById(R.id.value);
        final ImageButton editButton = (ImageButton) convertView.findViewById(R.id.edit_button);
        final ImageButton removeButton = (ImageButton) convertView.findViewById(R.id.remove_button);

        type.setAdapter(new KnockItemTypeAdapter(context));

        editButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                String dialogLabel = "";
                switch ((int) type.getSelectedItemId()) {

                    case KnockItem.TYPE_PAUSE:
                        dialogLabel = context.getString(R.string.ms).toLowerCase();
                        break;

                    case KnockItem.TYPE_TCP_PACKET:
                    case KnockItem.TYPE_UDP_PACKET:
                        dialogLabel = context.getString(R.string.port).toLowerCase();
                        break;

                }

                new NumberPickerBuilder()
                        .setFragmentManager(context.getSupportFragmentManager())
                        .setPlusMinusVisibility(View.INVISIBLE)
                        .setDecimalVisibility(View.INVISIBLE)
                        .setReference(position)
                        .setMaxNumber(65535)
                        .addNumberPickerDialogHandler(new NumberPickerDialogFragment.NumberPickerDialogHandler() {
                            @Override
                            public void onDialogNumberSet(int reference, int number, double decimal, boolean negative, double fullNumber) {
                                KnockItem item = getItem(reference);
                                item.setValue(number);
                                item.setType((int) type.getSelectedItemId());
                                save();
                            }
                        })
                        .setLabelText(dialogLabel)
                        .setStyleResId(R.style.BetterPickersDialogFragment_Light)
                        .show();
            }
        });

        removeButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                sequence.remove(position);
                save();
            }
        });

        if (position > sequence.size() - 1) {

            // This is the empty one, which allows users to add a new value
            removeButton.setEnabled(false);
            type.setSelection(KnockItem.TYPE_TCP_PACKET);
            value.setText(null);

        } else {

            // This is an actual item
            removeButton.setEnabled(true);
            KnockItem item = getItem(position);
            type.setSelection(item.getType());
            if (item.getValue() > -1) {
                value.setText(String.valueOf(item.getValue()));
            }

        }

        return convertView;

    }

    public void updateSequence(KnockSequence sequence) {
        this.sequence = sequence;
        notifyDataSetChanged();
    }
}