package com.addisonelliott.segmentedbutton.sample;

import android.graphics.Color;
import android.graphics.Typeface;
import android.graphics.drawable.Drawable;
import android.os.Build.VERSION;
import android.os.Build.VERSION_CODES;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;
import android.widget.Spinner;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.ContextCompat;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import com.addisonelliott.segmentedbutton.SegmentedButton;
import com.addisonelliott.segmentedbutton.SegmentedButtonGroup;
import com.addisonelliott.segmentedbutton.sample.drawable.BadgeDrawable;
import java.util.ArrayList;
import java.util.Random;

enum Action
{
    None,
    ChangeBorder1,
    ChangeBorder2,
    ChangeBackgroundColor,
    ChangeBackgroundDrawable,
    ChangeRadius,
    ChangePositionAnimated,
    ChangePosition,
    ToggleDraggable,
    ToggleRipple,
    ToggleRippleColor,
    ChangeDivider,
    ChangeAnimation,
    RemoveButtonDrawable,
    ChangeButtonDrawable,
    ChangeDrawableTint,
    ToggleDrawableSize,
    ChangeDrawableGravity,
    ChangeText,
    ChangeTextColor,
    ChangeTextSize,
    ChangeTypeface,
    ChangeSelectedButtonRadius,
    ChangeSelectedButtonBorderSolid,
    ChangeSelectedButtonBorderDashed,
    ToggleHiddenButtons,
    ChangeTextSize2;

    public String getDisplayText()
    {
        if (this == None)
            return "";
        else if (this == ChangeBorder1)
            return "Change border 1";
        else if (this == ChangeBorder2)
            return "Change border 2";
        else if (this == ChangeBackgroundColor)
            return "Change background and selected background to color";
        else if (this == ChangeBackgroundDrawable)
            return "Change background and selected background to drawable";
        else if (this == ChangeRadius)
            return "Change radius";
        else if (this == ChangePositionAnimated)
            return "Change position and animate movement";
        else if (this == ChangePosition)
            return "Change position without animating";
        else if (this == ToggleDraggable)
            return "Toggle draggable boolean";
        else if (this == ToggleRipple)
            return "Toggle ripple";
        else if (this == ToggleRippleColor)
            return "Toggle ripple color between black/white";
        else if (this == ChangeDivider)
            return "Change divider";
        else if (this == ChangeAnimation)
            return "Change animation duration & interpolator";
        else if (this == RemoveButtonDrawable)
            return "Remove button drawable";
        else if (this == ChangeButtonDrawable)
            return "Change button drawable";
        else if (this == ChangeDrawableTint)
            return "Change drawable tint color";
        else if (this == ToggleDrawableSize)
            return "Toggle drawable size";
        else if (this == ChangeDrawableGravity)
            return "Change drawable gravity";
        else if (this == ChangeText)
            return "Change text";
        else if (this == ChangeTextColor)
            return "Change text color";
        else if (this == ChangeTextSize)
            return "Change text size";
        else if (this == ChangeTypeface)
            return "Change typeface";
        else if (this == ChangeSelectedButtonRadius)
            return "Change selected button radius";
        else if (this == ChangeSelectedButtonBorderSolid)
            return "Change selected button border (solid)";
        else if (this == ChangeSelectedButtonBorderDashed)
            return "Change selected button border (dashed)";
        else if (this == ToggleHiddenButtons)
            return "Toggle hidden buttons";
        else if (this == ChangeTextSize2)
            return "Change Text Size 2";
        else
            return "";
    }
}

public class MainActivity extends AppCompatActivity implements OnItemSelectedListener
{
    private static final String TAG = "SegmentedButtonSample";

    @BindView(R.id.linearLayout)
    LinearLayout linearLayout;
    @BindView(R.id.spinner)
    Spinner spinner;
    @BindView(R.id.button_changePosition)
    Button changePositionButton;
    @BindView(R.id.buttonGroup_gradient)
    SegmentedButtonGroup gradientButtonGroup;
    @BindView(R.id.buttonGroup_lordOfTheRings)
    SegmentedButtonGroup lordOfTheRingsButtonGroup;
    @BindView(R.id.buttonGroup_DCSuperheros)
    SegmentedButtonGroup DCSuperHerosButtonGroup;
    @BindView(R.id.buttonGroup_marvelSuperheros)
    SegmentedButtonGroup marvelSuperherosButtonGroup;
    @BindView(R.id.buttonGroup_guys)
    SegmentedButtonGroup guysButtonGroup;
    @BindView(R.id.buttonGroup_starWars)
    SegmentedButtonGroup starWarsButtonGroup;
    @BindView(R.id.buttonGroup_darthVader)
    SegmentedButtonGroup darthVaderButtonGroup;
    @BindView(R.id.buttonGroup_draggable)
    SegmentedButtonGroup draggableButtonGroup;
    @BindView(R.id.buttonGroup_dynamic)
    SegmentedButtonGroup dynamicButtonGroup;
    @BindView(R.id.button_left)
    SegmentedButton leftButton;
    @BindView(R.id.button_right)
    SegmentedButton rightButton;
    @BindView(R.id.buttonGroup_pickupDropoffBoth)
    SegmentedButtonGroup pickupDropoffButtonGroup;
    @BindView(R.id.buttonGroup_starWarsAlt)
    SegmentedButtonGroup starWarsAltButtonGroup;
    @BindView(R.id.buttonGroup_roundSelectedButton)
    SegmentedButtonGroup roundSelectedButtonGroup;

    SegmentedButtonGroup yesNoMaybePButtonGroup;
    SegmentedButtonGroup starWarsPButtonGroup;
    SegmentedButtonGroup countPButtonGroup;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Initialize all variables annotated with @BindView and other variants
        ButterKnife.bind(this);

        ArrayList<String> spinnerItems = new ArrayList<>();

        for (Action action : Action.values())
        {
            spinnerItems.add(action.getDisplayText());
        }

        ArrayAdapter adapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, spinnerItems);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner.setAdapter(adapter);
        spinner.setOnItemSelectedListener(this);

        updateButton(gradientButtonGroup.getPosition());
        gradientButtonGroup.setOnPositionChangedListener(position -> updateButton(position));

        setupDynamicDrawables();
        setupYesNoMaybePButtonGroup();
        setupStarWarsPButtonGroup();
        setupCountPButtonGroup();

        // Basic checks
        if (starWarsButtonGroup.getButtons().size() != 3)
        {
            throw new AssertionError("Buttons size incorrect");
        }

        if (!lordOfTheRingsButtonGroup.getButton(1).getText().equals("Gimli"))
        {
            throw new AssertionError("Button name is incorrect");
        }
    }

    @Override
    public void onItemSelected(final AdapterView<?> parent, final View view, final int position, final long id)
    {
        Action action = Action.values()[position];

        switch (action)
        {
            case None:
                break;

            case ChangeBorder1:
                lordOfTheRingsButtonGroup.setBorder(5, Color.RED, 25, 8);
                marvelSuperherosButtonGroup.setBorder(5, Color.BLACK, 30, 10);
                break;

            case ChangeBorder2:
                lordOfTheRingsButtonGroup.setBorder(2, Color.RED, 25, 8);
                marvelSuperherosButtonGroup.setBorder(2, Color.BLACK, 30, 10);
                break;

            case ChangeBackgroundColor:
                lordOfTheRingsButtonGroup.setBackground(ContextCompat.getColor(getApplicationContext(),
                    R.color.brown_600));
                lordOfTheRingsButtonGroup.setSelectedBackground(ContextCompat.getColor(getApplicationContext(),
                    R.color.blue_800));
                break;

            case ChangeBackgroundDrawable:
                lordOfTheRingsButtonGroup.setBackground(ContextCompat.getDrawable(getApplicationContext(),
                    R.drawable.gradient_drawable));
                lordOfTheRingsButtonGroup.setSelectedBackground(ContextCompat.getDrawable(getApplicationContext(),
                    R.drawable.gradient_drawable_selector));
                break;

            case ChangeRadius:
                marvelSuperherosButtonGroup.setRadius(5);
                DCSuperHerosButtonGroup.setRadius(50);
                break;

            case ChangePositionAnimated:
                lordOfTheRingsButtonGroup.setPosition(((lordOfTheRingsButtonGroup.getPosition() + 1) % 3), true);
                break;

            case ChangePosition:
                lordOfTheRingsButtonGroup.setPosition(((lordOfTheRingsButtonGroup.getPosition() + 1) % 3), false);
                break;

            case ToggleDraggable:
                darthVaderButtonGroup.setDraggable(!darthVaderButtonGroup.isDraggable());
                break;

            case ToggleRipple:
                starWarsButtonGroup.setRipple(!starWarsButtonGroup.hasRipple());
                break;

            case ToggleRippleColor:
                starWarsButtonGroup.setRipple(starWarsButtonGroup.getRippleColor() == Color.WHITE ? Color.BLACK :
                    Color.WHITE);
                break;

            case ChangeDivider:
                lordOfTheRingsButtonGroup.setDivider(Color.MAGENTA, 10, 10, 10);
                guysButtonGroup.setDivider(ContextCompat.getDrawable(getApplicationContext(),
                    R.drawable.gradient_drawable_divider), 20, 0, 0);
                break;

            case ChangeAnimation:
                lordOfTheRingsButtonGroup.setSelectionAnimationDuration(
                    lordOfTheRingsButtonGroup.getSelectionAnimationDuration() == 500 ? 5000 : 500);

                final int random = new Random().nextInt(12);
                lordOfTheRingsButtonGroup.setSelectionAnimationInterpolator(random);
                break;

            case RemoveButtonDrawable:
                lordOfTheRingsButtonGroup.getButton(0).setDrawable(null);
                break;

            case ChangeButtonDrawable:
                lordOfTheRingsButtonGroup.getButton(0).setDrawable(ContextCompat.getDrawable(getApplicationContext(),
                    R.drawable.ic_b9));
                DCSuperHerosButtonGroup.getButton(1).setDrawable(ContextCompat.getDrawable(getApplicationContext(),
                    R.drawable.ic_aragorn));
                break;

            case ChangeDrawableTint:
                lordOfTheRingsButtonGroup.getButton(0).setSelectedDrawableTint(Color.RED);
                lordOfTheRingsButtonGroup.getButton(1).setDrawableTint(Color.GREEN);
                lordOfTheRingsButtonGroup.getButton(2).setDrawableTint(Color.BLUE);
                darthVaderButtonGroup.getButton(1).removeDrawableTint();
                break;

            case ToggleDrawableSize:
                final boolean setSize = !DCSuperHerosButtonGroup.getButton(0).hasDrawableWidth();
                final float size = dpToPx(96);

                for (SegmentedButton button : DCSuperHerosButtonGroup.getButtons())
                {
                    button.setDrawableWidth(setSize ? (int)size : -1);
                    button.setDrawableHeight(setSize ? (int)size : -1);
                }
                break;

            case ChangeDrawableGravity:
                gradientButtonGroup.getButton(0).setDrawableGravity(Gravity.LEFT);
                starWarsButtonGroup.getButton(0).setDrawableGravity(Gravity.RIGHT);

                int currentGravity = DCSuperHerosButtonGroup.getButton(0).getDrawableGravity();

                switch (currentGravity)
                {
                    case Gravity.LEFT:
                        currentGravity = Gravity.TOP;
                        break;
                    case Gravity.TOP:
                        currentGravity = Gravity.RIGHT;
                        break;
                    case Gravity.RIGHT:
                        currentGravity = Gravity.BOTTOM;
                        break;
                    case Gravity.BOTTOM:
                        currentGravity = Gravity.LEFT;
                        break;
                }

                DCSuperHerosButtonGroup.getButton(0).setDrawableGravity(currentGravity);
                break;

            case ChangeText:
                lordOfTheRingsButtonGroup.getButton(0).setText("Testing");
                lordOfTheRingsButtonGroup.getButton(1).setText("");
                break;

            case ChangeTextColor:
                lordOfTheRingsButtonGroup.getButton(0).setSelectedTextColor(Color.RED);
                lordOfTheRingsButtonGroup.getButton(1).setTextColor(Color.BLUE);
                gradientButtonGroup.getButton(1).removeSelectedTextColor();
                break;

            case ChangeTextSize:
                lordOfTheRingsButtonGroup.getButton(1).setTextSize(48.0f);
                DCSuperHerosButtonGroup.getButton(0).setTextSize(48.0f);
                break;

            case ChangeTypeface:
                lordOfTheRingsButtonGroup.getButton(0).setTextTypeface(Typeface.create((Typeface)null, Typeface.BOLD));
                break;

            case ChangeSelectedButtonRadius:
            {
                final float radius = dpToPx(30);

                lordOfTheRingsButtonGroup.setSelectedButtonRadius((int)radius);
                roundSelectedButtonGroup.setSelectedButtonRadius(0);
            }
            break;

            case ChangeSelectedButtonBorderSolid:
                lordOfTheRingsButtonGroup.setSelectedBorder(5, Color.MAGENTA, 0, 0);
                roundSelectedButtonGroup.setSelectedBorder(0, 0, 0, 0);
                break;

            case ChangeSelectedButtonBorderDashed:
                lordOfTheRingsButtonGroup.setSelectedBorder(5, Color.MAGENTA, 6, 3);
                roundSelectedButtonGroup.setSelectedBorder(16, Color.BLACK, 6, 2);
                break;

            case ToggleHiddenButtons:
            {
                SegmentedButton button = gradientButtonGroup.getButton(0);
                button.setVisibility(button.getVisibility() == View.VISIBLE ? View.GONE : View.VISIBLE);

                button = starWarsButtonGroup.getButton(1);
                button.setVisibility(button.getVisibility() == View.VISIBLE ? View.GONE : View.VISIBLE);

                button = darthVaderButtonGroup.getButton(2);
                button.setVisibility(button.getVisibility() == View.VISIBLE ? View.GONE : View.VISIBLE);

                button = draggableButtonGroup.getButton(0);
                button.setVisibility(button.getVisibility() == View.VISIBLE ? View.GONE : View.VISIBLE);

                button = roundSelectedButtonGroup.getButton(2);
                button.setVisibility(button.getVisibility() == View.VISIBLE ? View.GONE : View.VISIBLE);
            }
            break;

            case ChangeTextSize2:
                yesNoMaybePButtonGroup.getButton(0).setTextSize(dpToPx(36));
                yesNoMaybePButtonGroup.getButton(1).setTextSize(dpToPx(36));
                yesNoMaybePButtonGroup.getButton(2).setTextSize(dpToPx(36));
                break;

            default:
                break;
        }

        // Reset back to the normal value
        spinner.setSelection(0);
    }

    @Override
    public void onNothingSelected(final AdapterView<?> parent)
    {

    }

    @OnClick(R.id.button_changePosition)
    public void changePositionButton_onClick(View view)
    {
        int position = gradientButtonGroup.getPosition();
        position = ++position % 3;
        updateButton(position);

        gradientButtonGroup.setPosition(position, true);
    }

    private void setupDynamicDrawables()
    {
        final BadgeDrawable drawable = new BadgeDrawable(Color.RED, 80, 50, 3, 3);
        leftButton.setDrawable(drawable);

        dynamicButtonGroup.setOnPositionChangedListener(position -> {
            if (position == 0)
            {
                drawable.setCount(drawable.getCount() + 1);
            }
        });

        final Drawable drawable2 = ContextCompat.getDrawable(getApplicationContext(), R.drawable.ic_b1);
        rightButton.setDrawable(drawable2);
    }

    private void updateButton(int position)
    {
        changePositionButton.setText("Position: " + position);
    }

    private float dpToPx(float dp)
    {
        return dp * getResources().getDisplayMetrics().density;
    }

    private float pxToDp(float px)
    {
        return px / getResources().getDisplayMetrics().density;
    }

    private float spToPx(float sp)
    {
        return sp * getResources().getDisplayMetrics().scaledDensity;
    }

    private float pxToSp(float px)
    {
        return px / getResources().getDisplayMetrics().scaledDensity;
    }

    private void setupYesNoMaybePButtonGroup()
    {
        SegmentedButtonGroup buttonGroup = new SegmentedButtonGroup(this);
        buttonGroup.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
        ((LayoutParams)buttonGroup.getLayoutParams()).setMargins((int)dpToPx(4), (int)dpToPx(4),
            (int)dpToPx(4), (int)dpToPx(4));
        if (VERSION.SDK_INT >= VERSION_CODES.LOLLIPOP)
            buttonGroup.setElevation(dpToPx(2));
        buttonGroup.setBackground(Color.WHITE);
        buttonGroup.setRadius((int)dpToPx(30));
        buttonGroup.setRipple(Color.BLACK);
        buttonGroup.setSelectedBackground(getResources().getColor(R.color.blue_500));
        buttonGroup.setSelectedBorder((int)dpToPx(2), Color.rgb(0x55, 0x55, 0x55), 0, 0);
        buttonGroup.setSelectedButtonRadius((int)dpToPx(30));
        buttonGroup.setSelectionAnimationDuration(1000);

        SegmentedButton yesButton = new SegmentedButton(this);
        yesButton.setText("Yes");
        yesButton.setPadding((int)dpToPx(8), (int)dpToPx(8), (int)dpToPx(8), (int)dpToPx(8));
        yesButton.setLayoutParams(new LayoutParams(0, LayoutParams.WRAP_CONTENT, 1));
        yesButton.setTextColor(Color.BLACK);
        yesButton.setSelectedTextColor(Color.WHITE);
        yesButton.setTextSize(spToPx(24));
        buttonGroup.addView(yesButton);

        SegmentedButton maybeButton = new SegmentedButton(this);
        maybeButton.setText("Maybe");
        maybeButton.setPadding((int)dpToPx(8), (int)dpToPx(8), (int)dpToPx(8), (int)dpToPx(8));
        maybeButton.setLayoutParams(new LayoutParams(0, LayoutParams.WRAP_CONTENT, 1));
        maybeButton.setTextColor(Color.BLACK);
        maybeButton.setSelectedTextColor(Color.WHITE);
        maybeButton.setTextSize(spToPx(24));
        buttonGroup.addView(maybeButton);

        SegmentedButton noButton = new SegmentedButton(this);
        noButton.setText("No");
        noButton.setPadding((int)dpToPx(8), (int)dpToPx(8), (int)dpToPx(8), (int)dpToPx(8));
        noButton.setLayoutParams(new LayoutParams(0, LayoutParams.WRAP_CONTENT, 1));
        noButton.setTextColor(Color.BLACK);
        noButton.setSelectedTextColor(Color.WHITE);
        noButton.setTextSize(spToPx(24));
        buttonGroup.addView(noButton);

        buttonGroup.setPosition(1, false);
        linearLayout.addView(buttonGroup);
        yesNoMaybePButtonGroup = buttonGroup;
    }

    private void setupStarWarsPButtonGroup()
    {
        SegmentedButtonGroup buttonGroup = new SegmentedButtonGroup(this);
        buttonGroup.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
        ((LinearLayout.LayoutParams)buttonGroup.getLayoutParams()).setMargins((int)dpToPx(4), (int)dpToPx(4),
            (int)dpToPx(4), (int)dpToPx(4));
        ((LayoutParams)buttonGroup.getLayoutParams()).gravity = Gravity.CENTER_HORIZONTAL;
        if (VERSION.SDK_INT >= VERSION_CODES.LOLLIPOP)
            buttonGroup.setElevation(dpToPx(2));
        buttonGroup.setBackground(getResources().getColor(R.color.red_400));
        buttonGroup.setRadius((int)dpToPx(2));
        buttonGroup.setRipple(getResources().getColor(R.color.red_200));
        buttonGroup.setSelectedBackground(getResources().getColor(R.color.green_200));
        buttonGroup.setDivider(Color.WHITE, (int)dpToPx(2), (int)dpToPx(10), (int)dpToPx(10));

        SegmentedButton button1 = new SegmentedButton(this);
        button1.setLayoutParams(new LinearLayout.LayoutParams(0, LayoutParams.WRAP_CONTENT, 1));
        button1.setPadding((int)dpToPx(20), (int)dpToPx(6), (int)dpToPx(20), (int)dpToPx(6));
        button1.setDrawable(getResources().getDrawable(R.drawable.ic_b8));
        buttonGroup.addView(button1);

        SegmentedButton button2 = new SegmentedButton(this);
        button2.setLayoutParams(new LinearLayout.LayoutParams(0, LayoutParams.WRAP_CONTENT, 2));
        button2.setPadding((int)dpToPx(45), (int)dpToPx(6), (int)dpToPx(45), (int)dpToPx(6));
        button2.setDrawable(getResources().getDrawable(R.drawable.ic_b9));
        buttonGroup.addView(button2);

        SegmentedButton button3 = new SegmentedButton(this);
        button3.setLayoutParams(new LinearLayout.LayoutParams(0, LayoutParams.WRAP_CONTENT, 1));
        button3.setPadding((int)dpToPx(20), (int)dpToPx(6), (int)dpToPx(20), (int)dpToPx(6));
        button3.setDrawable(getResources().getDrawable(R.drawable.ic_b11));
        buttonGroup.addView(button3);

        buttonGroup.setPosition(1, false);
        linearLayout.addView(buttonGroup);
        starWarsPButtonGroup = buttonGroup;
    }

    private void setupCountPButtonGroup()
    {
        SegmentedButtonGroup buttonGroup = new SegmentedButtonGroup(this);
        buttonGroup.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
        ((LinearLayout.LayoutParams)buttonGroup.getLayoutParams()).setMargins((int)dpToPx(32), (int)dpToPx(16),
            (int)dpToPx(32), (int)dpToPx(16));
        ((LayoutParams)buttonGroup.getLayoutParams()).gravity = Gravity.CENTER_HORIZONTAL;
        buttonGroup.setBorder(3, Color.LTGRAY, 0, 0);
        buttonGroup.setDivider(Color.DKGRAY, 5, 5, 5);
        buttonGroup.setOnPositionChangedListener(position -> {
            if (countPButtonGroup == null)
                return;

            countPButtonGroup.getButton(2).setText(countPButtonGroup.getButton(2).getText());
        });

        String[] names = {
            "Two",
            "One",
            "None"
        };

        for (String name : names)
        {
            SegmentedButton button = new SegmentedButton(this);
            button.setText(name);
            button.setTextSize(dpToPx(18));
            button.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
            button.setPadding((int)dpToPx(20), (int)dpToPx(20), (int)dpToPx(20), (int)dpToPx(20));
            button.setTextColor(Color.BLACK);
            button.setSelectedTextColor(Color.WHITE);
            button.setSelectedBackgroundColor(getResources().getColor(R.color.colorPrimary));
            buttonGroup.addView(button);
        }

        linearLayout.addView(buttonGroup);
        countPButtonGroup = buttonGroup;
    }
}