package com.ticketmaster.mobilestudio.materialrangeslider;

import android.app.Dialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.DialogInterface.OnShowListener;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.design.widget.Snackbar;
import android.support.v4.app.DialogFragment;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AlertDialog.Builder;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import com.ticketmaster.mobilestudio.materialrangeslider.MaterialRangeSlider.RangeSliderListener;

import java.util.Currency;
import java.util.Locale;

import butterknife.Bind;
import butterknife.ButterKnife;

public class PriceRangePickerDialogFragment extends DialogFragment implements RangeSliderListener {

    public static final String MIN_PRICE_KEY = "min_price_key";
    public static final String MAX_PRICE_KEY = "max_price_key";
    public static final String SELECTED_MINIMUM_KEY = "selected_minimum_key";
    public static final String SELECTED_MAXIMUM_KEY = "selected_maximum_key";
    public static final String CURRENCY_SYMBOL_KEY = "currency_symbol_key";

    static final int PADDING = 36;

    private String currencyCode;

    @Bind(R.id.min_price_txt) TextView minPriceTxt;
    @Bind(R.id.max_price_txt) TextView maxPriceTxt;
    @Bind(R.id.price_slider) MaterialRangeSlider priceSlider;

    public static PriceRangePickerDialogFragment newInstance(int minPrice,
                                                        int maxPrice,
                                                        Integer selectedMinPrice,
                                                        Integer selectedMaxPrice,
                                                        @NonNull String currencySymbol) {
        PriceRangePickerDialogFragment fragment = new PriceRangePickerDialogFragment();
        fragment.setCancelable(false);
        Bundle bundle = new Bundle();
        bundle.putInt(MIN_PRICE_KEY, minPrice);
        bundle.putInt(MAX_PRICE_KEY, maxPrice);
        bundle.putString(CURRENCY_SYMBOL_KEY, currencySymbol);

        if (selectedMinPrice != null && selectedMaxPrice != null) {
            bundle.putInt(SELECTED_MINIMUM_KEY, selectedMinPrice);
            bundle.putInt(SELECTED_MAXIMUM_KEY, selectedMaxPrice);
        }

        fragment.setArguments(bundle);
        return fragment;
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        currencyCode = getArguments().getString(CURRENCY_SYMBOL_KEY);
        final AlertDialog dial = new Builder(getActivity())
                .setPositiveButton("Ok", new OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        Snackbar.make(getActivity().findViewById(R.id.root),
                                "Price range of " + minPriceTxt.getText().toString()
                                        + " - " + maxPriceTxt.getText().toString() + " selected.", Snackbar.LENGTH_LONG)
                                .show();
                    }
                })
                .setNeutralButton("Reset", new OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        //Do nothing - OnClickListener will be overridden in onStart()
                    }
                })
                .setCancelable(false)
                .create();
        dial.setOnShowListener(new OnShowListener() {
            @Override
            public void onShow(DialogInterface dialog) {
                dial.getButton(DialogInterface.BUTTON_POSITIVE).setTextColor(getResources().getColor(R.color.tms_blue));
                dial.getButton(DialogInterface.BUTTON_NEUTRAL).setTextColor(getResources().getColor(R.color.tms_blue));
            }
        });
        TextView title = new TextView(getActivity());
        title.setText(getString(R.string.price_dialog_title));
        title.setPadding(PADDING, PADDING, PADDING, PADDING);
        title.setTextSize(18);
        title.setTextAppearance(getActivity(), R.style.TitleText);
        dial.setCustomTitle(title);
        View slider = LayoutInflater.from(getActivity()).inflate(R.layout.dialog_price_range, null);
        ButterKnife.bind(this, slider);
        priceSlider.setRangeSliderListener(this);
        priceSlider.setMin(getArguments().getInt(MIN_PRICE_KEY));
        priceSlider.setMax(getArguments().getInt(MAX_PRICE_KEY));
        dial.setView(slider);
        currencyCode = Currency.getInstance(Locale.getDefault()).getSymbol();

        int startingMin = getArguments().getInt(SELECTED_MINIMUM_KEY, getArguments().getInt(MIN_PRICE_KEY));
        int startingMax = getArguments().getInt(SELECTED_MAXIMUM_KEY, getArguments().getInt(MAX_PRICE_KEY));

        priceSlider.setStartingMinMax(startingMin, startingMax);

        return dial;
    }

    @Override
    public void onMinChanged(int newValue) {
        minPriceTxt.setText(currencyCode + String.valueOf(newValue));
    }

    @Override
    public void onMaxChanged(int newValue) {
        maxPriceTxt.setText(currencyCode + String.valueOf(newValue));
    }

    @Override
    public void onStart() {
        super.onStart();

//         Override onClickListener so dialog is not closed when user clicks reset
        AlertDialog d = (AlertDialog) getDialog();
        if (d != null) {
            Button negativeButton = d.getButton(Dialog.BUTTON_NEUTRAL);
            negativeButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    priceSlider.reset();
                    priceSlider.invalidate();
                }
            });
        }
    }

    public static class PriceRangeSelectedEvent {
        final int selectedMin;
        final int selectedMax;

        public PriceRangeSelectedEvent(int selectedMin, int selectedMax) {
            this.selectedMin = selectedMin;
            this.selectedMax = selectedMax;
        }

        public int getSelectedMin() {
            return selectedMin;
        }

        public int getSelectedMax() {
            return selectedMax;
        }
    }
}