/*
 * Copyright 2019 Uriah Shaul Mandel
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.bald.uriah.baldphone.views;

import android.annotation.SuppressLint;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.res.TypedArray;
import android.os.Build;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;

import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
import androidx.viewpager.widget.PagerAdapter;
import androidx.viewpager.widget.ViewPager;

import com.bald.uriah.baldphone.R;
import com.bald.uriah.baldphone.utils.BPrefs;
import com.bald.uriah.baldphone.utils.D;
import com.duolingo.open.rtlviewpager.RtlViewPager;
import com.google.android.material.tabs.TabLayout;

import java.util.Locale;

public class ViewPagerHolder extends LinearLayout {
    private static final int HEIGHT = 60;//in dp
    private Context context;

    private CharSequence itemType;
    private String of;

    //views
    private View right, left;
    private ViewPager viewPager;
    private TextView page_of_;
    private View circles;

    private boolean noArrows = false;
    private boolean useCircle = false;
    private boolean showHints = false;

    private int pageIndex;

    public ViewPagerHolder(Context context) {
        super(context);
        init(context, null);
    }

    public ViewPagerHolder(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        init(context, attrs);
    }

    public ViewPagerHolder(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(context, attrs);
    }

    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    public ViewPagerHolder(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
        init(context, attrs);
    }

    private void init(Context context, @Nullable AttributeSet attributeSet) {
        this.context = context;
        final SharedPreferences sharedPreferences = context.getSharedPreferences(D.BALD_PREFS, Context.MODE_PRIVATE);
        noArrows = sharedPreferences.getBoolean(BPrefs.TOUCH_NOT_HARD_KEY, false);
        final TypedArray typedArray = context.obtainStyledAttributes(attributeSet, R.styleable.ViewPagerHolder);
        itemType = typedArray.getString(R.styleable.ViewPagerHolder_item_type);
        if (itemType == null)
            itemType = context.getString(R.string.page);
        useCircle = typedArray.getBoolean(R.styleable.ViewPagerHolder_use_circles, false);
        showHints = typedArray.getBoolean(R.styleable.ViewPagerHolder_show_hints, false);

        typedArray.recycle();
        of = String.valueOf(context.getText(R.string.of));
        this.setOrientation(VERTICAL);

        viewPager = noArrows ? new RtlViewPager(context) : new NonSwipeableViewPager(context);
        viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
            }

            @Override
            public void onPageSelected(int position) {
                pageChangeHandler(position);
            }

            @Override
            public void onPageScrollStateChanged(int state) {
            }
        });
        viewPager.setId(R.id.id_dummy);
        addView(viewPager, new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 0, 1f));
        setup();

    }

    public void setItemType(CharSequence itemType) {
        this.itemType = itemType;
    }

    @SuppressLint("ClickableViewAccessibility")
    private void setup() {
        final LayoutInflater layoutInflater = LayoutInflater.from(context);

        if (showHints) {
            final TextView textView = (TextView) layoutInflater.inflate(R.layout.view_pager_holder_hint, this, false);
            textView.setText(noArrows ? R.string.swipe_left_or_right : R.string.press_next_or_back_buton);
            addView(textView);
        }

        if (!noArrows) {
            final View arrowHolder = layoutInflater.inflate(R.layout.view_pager_holder_arrows, this, false);
            right = arrowHolder.findViewById(R.id.right_arrow);
            left = arrowHolder.findViewById(R.id.left_arrow);
            right.setOnClickListener(D.longer);
            right.setOnClickListener(v -> {
                final int currentItem = viewPager.getCurrentItem();
                final PagerAdapter pagerAdapter = viewPager.getAdapter();
                if (!(pagerAdapter == null || currentItem + 1 >= pagerAdapter.getCount()))
                    viewPager.setCurrentItem(currentItem + 1);
            });
            left.setOnClickListener(v -> {
                final int currentItem = viewPager.getCurrentItem();
                final PagerAdapter pagerAdapter = viewPager.getAdapter();
                if (!(pagerAdapter == null || currentItem - 1 < 0))
                    viewPager.setCurrentItem(currentItem - 1);

            });
            addView(arrowHolder, new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, HEIGHT, context.getResources().getDisplayMetrics())));
        }

        if (useCircle) {
            circles = layoutInflater.inflate(R.layout.circles, this, false);
            ((TabLayout) circles.findViewById(R.id.tab)).setupWithViewPager(viewPager);
        } else {
            page_of_ = (TextView) layoutInflater.inflate(R.layout.page_of_, this, false);
        }
        addView(useCircle ? circles : page_of_);

    }

    private void pageChangeHandler(int position) {
        final PagerAdapter pagerAdapter = viewPager.getAdapter();
        if (pagerAdapter == null)
            return;

        if (!noArrows) {
            right.setVisibility(position + 1 < pagerAdapter.getCount() ? VISIBLE : INVISIBLE);
            left.setVisibility((position > 0) ? VISIBLE : INVISIBLE);
        }
        pageIndex = position;
        applyPage_of_();
    }

    private void applyPage_of_() {
        if (!useCircle)
            page_of_.setText(String.format(Locale.US, "%s %d %s %d", itemType, pageIndex + 1, of, viewPager.getAdapter().getCount()));
    }

    @SuppressLint("ClickableViewAccessibility")
    public void setViewPagerAdapter(PagerAdapter pagerAdapter) {
        viewPager.setAdapter(pagerAdapter);
        applyPage_of_();
        pageChangeHandler(viewPager.getCurrentItem());

    }

    public void setCurrentItem(int item) {
        viewPager.setCurrentItem(item);
    }

    public void setPageTransformer(boolean reverseDrawingOrder,
                                   @Nullable ViewPager.PageTransformer transformer) {
        viewPager.setPageTransformer(reverseDrawingOrder, transformer);
    }

    public void notifyDataChanegd() {
        pageChangeHandler(pageIndex);
    }

    public int getPageIndex() {
        return pageIndex;
    }

    public int getCount() {
        return viewPager.getAdapter().getCount();
    }

    /**
     * be careful
     *
     * @return viewPager
     */
    public ViewPager getViewPager() {
        return viewPager;
    }
}