package com.virtual.pollentia.WalkingTour.modelo;

/**
 * Created by Roger Gomez
 */

import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Point;
import android.media.ExifInterface;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.Display;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;

import com.virtual.pollentia.WalkingTour.controlador.Controlador;
import com.virtual.pollentia.pollentia_tour.R;

import java.io.IOException;
import java.util.ArrayList;

public class FullScreenImageAdapter extends PagerAdapter {

    //variables globales

    //activity que lo crea
    private Activity _activity;
    //rutas de imagenes
    private ArrayList<String> _imagePaths;
    //textos de imagenes
    private ArrayList<String> _textos;
    //Layout
    private LayoutInflater inflater;
    //ancho pantalla
    private int width;
    //alto pantalla
    private int height;
    //controlador
    private Controlador controlador;

    /**
     * Constructor de la clase.
     *
     * @param activity   activity que crea la clase.
     * @param imagePaths arraylist con las rutas de las imagenes.
     * @param textos     arraylisst con los textos de las imagenes.
     */
    public FullScreenImageAdapter(Activity activity,
                                  ArrayList<String> imagePaths, ArrayList<String> textos,Controlador con) {
        this._activity = activity;
        this._imagePaths = imagePaths;
        this._textos = textos;
        WindowManager wm = (WindowManager) _activity.getSystemService(Context.WINDOW_SERVICE);
        Display display = wm.getDefaultDisplay();
        Point size = new Point();
        display.getSize(size);
        width = size.x;
        height = size.y;
        controlador=con;
    }

    /**
     * Devuelve el número de imagenes.
     *
     * @return integer con el numero de imagenes.
     */
    @Override
    public int getCount() {
        return this._imagePaths.size();
    }

    /**
     * Devuelve si la vista es la de un objeto.
     *
     * @param view   la vista.
     * @param object el relativeLayout.
     * @return boleano indicando si es correcto o no.
     */
    @Override
    public boolean isViewFromObject(View view, Object object) {
        return view == ((RelativeLayout) object);
    }

    /**
     * Crea un layout con una imagen.
     *
     * @param container contenedor.
     * @param position  posicion del contenedor.
     * @return devuelve el layout.
     */
    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        ImageView imgDisplay = null;
        //creamos el layout
        inflater = (LayoutInflater) _activity
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View viewLayout = inflater.inflate(R.layout.layout_fullscreen_image, container,
                false);
        imgDisplay = (ImageView) viewLayout.findViewById(R.id.imgDisplay);

        //creamos un sample de la imagen y la rotamos si es necessario
        imgDisplay.setImageBitmap(decodeSampledBitmapFromPath(_imagePaths.get(position), width, height));

        // Creamo el botón de cerrar
        Button newButton = new Button(container.getContext());
        newButton.setText("Cerrar");
        newButton.setTextColor(Color.WHITE);
        newButton.setBackgroundColor(Color.BLACK);
        RelativeLayout lay = (RelativeLayout) viewLayout.findViewById(R.id.fullscreen_layout);
        lay.addView(newButton);

        //si hay textos en la imagen los mostramos en un textView
        if (this._textos.size() != 0) {
            if (!this._textos.get(position).equals("")) {
                TextView text = (TextView) viewLayout.findViewById(R.id.imageText);
                text.setText(this._textos.get(position));
            }
        }


        //Listener del boton de cerrar
        newButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(controlador.isAudioPlaying()){
                    controlador.closeAudio();
                }
                _activity.finish();
            }
        });

        ((ViewPager) container).addView(viewLayout);

        return viewLayout;
    }

    /**
     * Detrcutor de un item del layout.
     *
     * @param container contenedor.
     * @param position  posicion del contenedor.
     * @param object    el relativeLayout.
     */
    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        ((ViewPager) container).removeView((RelativeLayout) object);

    }

    /**
     * Calculamos el tamaño del sample a partir del tamaño de la pantalla del dispositivo.
     *
     * @param options   opciones del bitmapFactory.
     * @param reqWidth  ancho de pantalla.
     * @param reqHeight Alto de pantalla.
     * @return inetger con tamaño del sample.
     */

    public static int calculateInSampleSize(BitmapFactory.Options options,
                                            int reqWidth, int reqHeight) {

        final int height = options.outHeight;
        final int width = options.outWidth;
        int inSampleSize = 1;

        if (height > reqHeight || width > reqWidth) {
            if (width > height) {
                inSampleSize = Math.round((float) height / (float) reqHeight);
            } else {
                inSampleSize = Math.round((float) width / (float) reqWidth);
            }
        }
        return inSampleSize;
    }

    /**
     * Crea el sample de la imagen.
     *
     * @param path      ruta de la imagen.
     * @param reqWidth  ancho de pantalla.
     * @param reqHeight alto de pantalla.
     * @return
     */
    public static Bitmap decodeSampledBitmapFromPath(String path, int reqWidth,
                                                     int reqHeight) {

        final BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        BitmapFactory.decodeFile(path, options);

        options.inSampleSize = calculateInSampleSize(options, reqWidth,
                reqHeight);

        // Decdificamos el bitmap con el tamaño calculado
        options.inJustDecodeBounds = false;
        Bitmap bmp = BitmapFactory.decodeFile(path, options);
        Bitmap rotatedBitmap = bmp;

        //rotamos la imagen en caso de que fuera neceario
        int degree = 0;
        ExifInterface ei = null;
        try {
            ei = new ExifInterface(path);

            int orientation = ei.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);

            switch (orientation) {
                case ExifInterface.ORIENTATION_NORMAL:
                    degree = 0;
                    break;
                case ExifInterface.ORIENTATION_ROTATE_90:
                    degree = 90;
                    break;
                case ExifInterface.ORIENTATION_ROTATE_180:
                    degree = 180;
                    break;
                case ExifInterface.ORIENTATION_ROTATE_270:
                    degree = 270;
                    break;
                case ExifInterface.ORIENTATION_UNDEFINED:
                    degree = 0;
                    break;
                default:
                    degree = 90;
            }
            Matrix matrix = new Matrix();

            matrix.postRotate(degree);

            rotatedBitmap = Bitmap.createBitmap(bmp, 0, 0, bmp.getWidth(), bmp.getHeight(), matrix, true);
        } catch (IOException e) {
            e.printStackTrace();
        }
        bmp = null;
        //devolvemos el sample creado
        return rotatedBitmap;
    }


}
