package com.martinrgb.animerexample;

import android.content.Context;
import android.content.res.Resources;
import android.opengl.Visibility;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.util.Log;
import android.util.TypedValue;
import android.view.Display;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;

import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.ContextCompat;

import com.martinrgb.animer.component.scrollview.AnScrollView;
import com.martinrgb.animer.monitor.AnConfigRegistry;
import com.martinrgb.animer.monitor.AnConfigView;

public class ScrollerActivity extends AppCompatActivity {


    private final int ROW_COUNT = 20;
    private int[] imageViews = new int[]{R.drawable.img_1,R.drawable.img_2,R.drawable.img_3,R.drawable.img_4};
    private AnConfigView mAnimerConfiguratorView;
    private  int  cellSize;
    private float screenWidth,screenHeight;
    private AnScrollView customScrollViewV,customScrollViewH;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        deleteBars();
        setContentView(R.layout.activity_scroller);
        measureDisplay();
        createLayout();
        addAnimerConfig();
    }

    private void createLayout(){

        // Vertical content
        ViewGroup contentV = (ViewGroup) findViewById(R.id.content_view_v);
        for (int i = 0; i < ROW_COUNT; i++) {

            ExampleRowView exampleRowView = new ExampleRowView(getApplicationContext());

            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
                    LinearLayout.LayoutParams.MATCH_PARENT,
                    (int) LinearLayout.LayoutParams.WRAP_CONTENT
            );
            exampleRowView.getRootLayout().setLayoutParams(params);

            exampleRowView.setHeader("Header " + i);
            exampleRowView.setSub("Sub " + i);
            exampleRowView.setImage(imageViews[i%4]);
            contentV.addView(exampleRowView);
        }

        // Horizontal content
        ViewGroup contentH = (ViewGroup) findViewById(R.id.content_view_h);
        for (int i = 0; i < ROW_COUNT; i++) {

            ExampleRowView exampleRowView = new ExampleRowView(getApplicationContext());
            exampleRowView.setHeader("Header " + i);
            exampleRowView.setSub("Sub " + i);
            exampleRowView.setImage(imageViews[i%4]);
            if(i == 0){
                LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
                        cellSize,
                        LinearLayout.LayoutParams.WRAP_CONTENT
                );
                params.setMargins( (int)(screenWidth - cellSize)/2, 0, 0, 0);
                exampleRowView.setLayoutParams(params);
            }
            else if(i == ROW_COUNT - 1){
                LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
                        cellSize,
                        LinearLayout.LayoutParams.WRAP_CONTENT
                );
                params.setMargins( 0, 0, (int)(screenWidth - cellSize)/2, 0);
                exampleRowView.setLayoutParams(params);
            }
            contentH.addView(exampleRowView);
        }


        // Vertical sv
        customScrollViewV = findViewById(R.id.scrollView_v);
        RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
                RelativeLayout.LayoutParams.MATCH_PARENT,
                (int)RelativeLayout.LayoutParams.MATCH_PARENT
        );
        params.addRule(RelativeLayout.ALIGN_PARENT_TOP);
        customScrollViewV.setLayoutParams(params);
        customScrollViewV.getScroller().setVertScroll(true);

        // Horizontal sv
        customScrollViewH = findViewById(R.id.scrollView_h);
        params = new RelativeLayout.LayoutParams(
                RelativeLayout.LayoutParams.MATCH_PARENT,
                (int) screenHeight/2
        );
        params.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
        customScrollViewH.setLayoutParams(params);
        customScrollViewH.getScroller().setVertScroll(false);
        customScrollViewH.getScroller().setFixedScroll(true,cellSize);
        customScrollViewH.setVisibility(View.INVISIBLE);
    }

    private void addAnimerConfig(){

        mAnimerConfiguratorView = (AnConfigView) findViewById(R.id.an_configurator);
        AnConfigRegistry.getInstance().addAnimer("V_Fling",customScrollViewV.getScroller().getFlingAnimer());
        AnConfigRegistry.getInstance().addAnimer("V_SpringBack",customScrollViewV.getScroller().getSpringAnimer());
        AnConfigRegistry.getInstance().addAnimer("V_FakeFling When Fixed Scroll",customScrollViewV.getScroller().getFakeFlingAnimer());
        AnConfigRegistry.getInstance().addAnimer("H_Fling",customScrollViewH.getScroller().getFlingAnimer());
        AnConfigRegistry.getInstance().addAnimer("H_SpringBack",customScrollViewH.getScroller().getSpringAnimer());
        AnConfigRegistry.getInstance().addAnimer("H_FakeFling When Fixed Scroll",customScrollViewH.getScroller().getFakeFlingAnimer());
        mAnimerConfiguratorView.refreshAnimerConfigs();
    }

    private class ExampleRowView extends LinearLayout {
        private final TextView mHeaderView;
        private final TextView mSubView;
        private final SmoothCornersImage mImageView;
        private final LinearLayout root;

        public ExampleRowView(Context context) {
            super(context);
            LayoutInflater inflater = LayoutInflater.from(context);
            ViewGroup view = (ViewGroup) inflater.inflate(R.layout.custom_cell_view, this, false);
            root = view.findViewById(R.id.root);
            mHeaderView = (TextView) view.findViewById(R.id.head_view);
            mSubView = (TextView) view.findViewById(R.id.sub_view);
            mImageView = view.findViewById(R.id.img_view);
            mImageView.setRoundRadius(60);
            addView(view);
        }

        public void setHeader(String text) {
            mHeaderView.setText(text);
        }
        public void setSub(String text) {
            mSubView.setText(text);
        }
        public void setImage(int id) {
            mImageView.setImageDrawable(ContextCompat.getDrawable(getApplicationContext(),id));
            mImageView.setScaleType(ImageView.ScaleType.MATRIX);
        }
        public LinearLayout getRootLayout(){
            return root;
        }
    }

    private void deleteBars() {
        this.requestWindowFeature(Window.FEATURE_NO_TITLE);
        this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
        getWindow().requestFeature(Window.FEATURE_ACTION_BAR);
        getSupportActionBar().hide();
    }

    private void measureDisplay() {
        Display display = getWindowManager().getDefaultDisplay();
        DisplayMetrics outMetrics = new DisplayMetrics ();
        display.getMetrics(outMetrics);
        float density  = getResources().getDisplayMetrics().density;
        float dpHeight = outMetrics.heightPixels / density;
        float dpWidth  = outMetrics.widthPixels / density;
        screenHeight = dpToPx(dpHeight,getResources());
        screenWidth = dpToPx(dpWidth,getResources());
        cellSize =  (int) getResources().getDimension(R.dimen.cell_size_dp);
        Log.e("inDP","doHeight"+ dpHeight + "dpWidth" + dpWidth);
    }
    public static int dpToPx(float dp, Resources res) {
        return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,dp,res.getDisplayMetrics());
    }
}