package com.borjabolufer.elevate.ui.fragments;

import android.content.Intent;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageButton;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.VideoView;

import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;

import com.borjabolufer.elevate.R;
import com.borjabolufer.elevate.model.Ejercicio;
import com.google.android.material.button.MaterialButton;
import com.google.android.material.chip.Chip;
import com.pierfrancescosoffritti.androidyoutubeplayer.core.player.PlayerConstants;
import com.pierfrancescosoffritti.androidyoutubeplayer.core.player.YouTubePlayer;
import com.pierfrancescosoffritti.androidyoutubeplayer.core.player.listeners.AbstractYouTubePlayerListener;
import com.pierfrancescosoffritti.androidyoutubeplayer.core.player.views.YouTubePlayerView;
import com.pierfrancescosoffritti.androidyoutubeplayer.core.ui.DefaultPlayerUiController;

import java.util.concurrent.TimeUnit;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class DetalleEjercicioFragment extends Fragment implements MediaPlayer.OnPreparedListener,
        MediaPlayer.OnCompletionListener, MediaPlayer.OnErrorListener {

    private static final String TAG = "DetalleEjercicioFragment";
    private static final String ARG_EJERCICIO = "ejercicio";
    private static final String ARG_TIPO = "tipo";

    private Ejercicio ejercicio;
    private String tipoEjercicio;

      
    private TextView nombreTextView;
    private TextView descripcionTextView;
    private TextView grupoMuscularTextView;
    private TextView nivelDificultadTextView;
    private TextView seriesTextView;
    private TextView repeticionesTextView;
    private TextView descansoTextView;
    private Chip chipTipoEjercicio;

      
    private ImageButton btnVolver;

      
    private VideoView videoView;
    private ImageButton btnPlayPause;
    private SeekBar seekBar;
    private TextView durationTextView;
    private MaterialButton externalVideoButton;

      
    private View descripcionContainer;
    private View grupoMuscularContainer;
    private View nivelDificultadContainer;
    private View parametersContainer;
    private View videoContainer;
    private View noVideoOverlay;
    private View duracionContainer;

      
    private Handler handler = new Handler();
    private boolean isVideoReady = false;
    private boolean isPlaying = false;

    private YouTubePlayerView youTubePlayerView;

    public static DetalleEjercicioFragment newInstance(Ejercicio ejercicio) {
        return newInstance(ejercicio, "principal");
    }

    public static DetalleEjercicioFragment newInstance(Ejercicio ejercicio, String tipo) {
        DetalleEjercicioFragment fragment = new DetalleEjercicioFragment();
        Bundle args = new Bundle();
        args.putSerializable(ARG_EJERCICIO, ejercicio);
        args.putString(ARG_TIPO, tipo);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
            ejercicio = (Ejercicio) getArguments().getSerializable(ARG_EJERCICIO);
            tipoEjercicio = getArguments().getString(ARG_TIPO, "principal");
        }
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_ejercicio_detalle, container, false);

        inicializarViews(view);
        configurarBotonVolver();
        configurarVistasSegunTipo();
        configurarVideo();

        return view;
    }

    private void inicializarViews(View view) {
          
        nombreTextView = view.findViewById(R.id.text_exercise_title);
        descripcionTextView = view.findViewById(R.id.text_description_content);
        grupoMuscularTextView = view.findViewById(R.id.text_grupo_muscular);
        nivelDificultadTextView = view.findViewById(R.id.text_nivel_dificultad);
        seriesTextView = view.findViewById(R.id.text_series_value);
        repeticionesTextView = view.findViewById(R.id.text_repetitions_value);
        descansoTextView = view.findViewById(R.id.text_rest_value);
        chipTipoEjercicio = view.findViewById(R.id.chip_tipo_ejercicio);
        youTubePlayerView = view.findViewById(R.id.youtube_player_view);

          
  

          

        externalVideoButton = view.findViewById(R.id.button_external_video);

          
        descripcionContainer = view.findViewById(R.id.description_container);
        grupoMuscularContainer = view.findViewById(R.id.grupo_muscular_container);
        nivelDificultadContainer = view.findViewById(R.id.nivel_dificultad_container);
        parametersContainer = view.findViewById(R.id.parameters_container);
        videoContainer = view.findViewById(R.id.video_container);
        noVideoOverlay = view.findViewById(R.id.no_video_overlay);
        duracionContainer = view.findViewById(R.id.duracion_container);
    }

      
    private void configurarBotonVolver() {
        if (btnVolver != null) {
            btnVolver.setOnClickListener(v -> {
                try {
                      
                    androidx.navigation.NavController navController =
                            androidx.navigation.Navigation.findNavController(requireView());
                    navController.popBackStack();
                } catch (Exception e) {
                      
                    requireActivity().getSupportFragmentManager().popBackStack();
                }
            });
        }
    }

    private void configurarVistasSegunTipo() {
          
        nombreTextView.setText(ejercicio.getNombre());

          
        configurarChipTipo();

        switch (tipoEjercicio.toLowerCase()) {
            case "calentamiento":
                configurarParaCalentamiento();
                break;
            case "enfriamiento":
                configurarParaEnfriamiento();
                break;
            default:
                configurarParaEjercicioPrincipal();
                break;
        }
    }

    private void configurarChipTipo() {
        if (chipTipoEjercicio != null) {
            switch (tipoEjercicio.toLowerCase()) {
                case "calentamiento":
                    chipTipoEjercicio.setText("🔥 Calentamiento");
                    chipTipoEjercicio.setChipBackgroundColorResource(R.color.warning);
                    break;
                case "enfriamiento":
                    chipTipoEjercicio.setText("🧘 Enfriamiento");
                    chipTipoEjercicio.setChipBackgroundColorResource(R.color.success);
                    break;
                default:
                    chipTipoEjercicio.setText("💪 Principal");
                    chipTipoEjercicio.setChipBackgroundColorResource(R.color.primary);
                    break;
            }
        }
    }

    private void configurarParaCalentamiento() {
        Log.d(TAG, "Configurando vista para calentamiento");

          
        mostrarVista(descripcionContainer);
        descripcionTextView.setText(extraerDescripcionLimpia());
        descansoTextView.setText(ejercicio.getDescanso());
        mostrarVista(parametersContainer);

        configurarVideoParaCalentamientoEnfriamiento();

    }

    private void configurarParaEnfriamiento() {
        Log.d(TAG, "Configurando vista para enfriamiento");

          
        mostrarVista(descripcionContainer);
        mostrarVista(parametersContainer);


        descripcionTextView.setText(extraerDescripcionLimpia());

        descansoTextView.setText(ejercicio.getDescanso() != null ? ejercicio.getDescanso() : "No especificado");
    }

    private void configurarParaEjercicioPrincipal() {
        Log.d(TAG, "Configurando vista para ejercicio principal");

          
        mostrarVista(descripcionContainer);
        mostrarVista(parametersContainer);


        descripcionTextView.setText(extraerDescripcionLimpia());
        seriesTextView.setText(String.valueOf(ejercicio.getSeries()));
        repeticionesTextView.setText(String.valueOf(ejercicio.getRepeticiones()));
        descansoTextView.setText(ejercicio.getDescanso() != null ? ejercicio.getDescanso() : "No especificado");

          
        String grupoMuscular = extraerGrupoMuscular();
        String nivelDificultad = extraerNivelDificultad();

        if (!grupoMuscular.isEmpty()) {
            mostrarVista(grupoMuscularContainer);
            grupoMuscularTextView.setText(grupoMuscular);
        }

        if (!nivelDificultad.isEmpty()) {
            mostrarVista(nivelDificultadContainer);
            nivelDificultadTextView.setText(nivelDificultad);
        }
    }

      

    private String extraerDescripcionLimpia() {
        String descripcion = ejercicio.getDescripcion();
        if (descripcion == null || descripcion.trim().isEmpty()) {
            return "Sin descripción disponible";
        }

          
        return descripcion
                .replaceAll("\\s*\\|\\s*Grupo muscular:.*?(?=\\||$)", "")
                .replaceAll("\\s*\\|\\s*Nivel:.*?(?=\\||$)", "")
                .replaceAll("\\s*\\|\\s*Duración:.*?(?=\\||$)", "")
                .trim();
    }

    private String extraerGrupoMuscular() {
        String descripcion = ejercicio.getDescripcion();
        if (descripcion != null && descripcion.contains("Grupo muscular:")) {
            String[] partes = descripcion.split("\\|");
            for (String parte : partes) {
                if (parte.trim().startsWith("Grupo muscular:")) {
                    return parte.replace("Grupo muscular:", "").trim();
                }
            }
        }
        return "";
    }

    private String extraerNivelDificultad() {
        String descripcion = ejercicio.getDescripcion();
        if (descripcion != null && descripcion.contains("Nivel:")) {
            String[] partes = descripcion.split("\\|");
            for (String parte : partes) {
                if (parte.trim().startsWith("Nivel:")) {
                    return parte.replace("Nivel:", "").trim();
                }
            }
        }
        return "";
    }

    private String extraerDuracion() {
        String descripcion = ejercicio.getDescripcion();
        if (descripcion != null && descripcion.contains("Duración:")) {
            String[] partes = descripcion.split("\\|");
            for (String parte : partes) {
                if (parte.trim().startsWith("Duración:")) {
                    return parte.replace("Duración:", "").trim();
                }
            }
        }
        return "";
    }

    private void configurarVideoParaCalentamientoEnfriamiento() {
        String videoUrl = ejercicio.getVideoUrl();

        if (videoUrl == null || videoUrl.trim().isEmpty()) {
              
            ocultarVista(videoContainer);
            ocultarVista(youTubePlayerView);
            ocultarVista(externalVideoButton);
            ocultarVista(noVideoOverlay);
            return;
        }

          
        ocultarVista(videoContainer);
        ocultarVista(youTubePlayerView);
        ocultarVista(noVideoOverlay);
        mostrarVista(externalVideoButton);

          
        if (esYouTubeUrl(videoUrl)) {
            externalVideoButton.setText("📹 Ver Video de " +
                    (tipoEjercicio.equals("calentamiento") ? "Calentamiento" : "Enfriamiento"));
        } else {
            externalVideoButton.setText("📹 Ver Video Demostrativo");
        }

        externalVideoButton.setOnClickListener(v -> {
            try {
                Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(videoUrl));

                  
                if (esYouTubeUrl(videoUrl)) {
                    intent.setPackage("com.google.android.youtube");
                    if (intent.resolveActivity(requireContext().getPackageManager()) != null) {
                        startActivity(intent);
                    } else {
                          
                        intent.setPackage(null);
                        startActivity(intent);
                    }
                } else {
                      
                    startActivity(intent);
                }
            } catch (Exception e) {
                Log.e(TAG, "Error abriendo video externo", e);
                Toast.makeText(getContext(), "No se pudo abrir el video", Toast.LENGTH_SHORT).show();
            }
        });
    }
    private void configurarVideo() {
        String videoUrl = ejercicio.getVideoUrl();

        if (videoUrl == null || videoUrl.trim().isEmpty()) {
            mostrarVistaNoVideo();
            return;
        }

        if (esYouTubeUrl(videoUrl)) {
              
            String videoId = extraerIdVideoYouTube(videoUrl);
            configurarVideoYouTube(videoId);
        } else if (esVideoLocal(videoUrl)) {
            configurarVideoLocal(videoUrl);
        } else {
            configurarVideoDirecto(videoUrl);
        }
    }

    private String extraerIdVideoYouTube(String url) {
          
        Pattern pattern = Pattern.compile("(?<=watch\\?v=|/videos/|embed\\/|youtu.be\\/|\\/v\\/|\\/e\\/|watch\\?feature=player_embedded&v=)([^#\\&\\?]*)");
        Matcher matcher = pattern.matcher(url);

        if (matcher.find()) {
            return matcher.group();
        }
        return null;
    }

    private void configurarVideoYouTube(String videoId) {
        if (videoId == null) {
            mostrarVistaNoVideo();
            return;
        }

        ocultarVista(noVideoOverlay);
        ocultarVista(externalVideoButton);
        mostrarVista(youTubePlayerView);

        getLifecycle().addObserver(youTubePlayerView);

        youTubePlayerView.addYouTubePlayerListener(new AbstractYouTubePlayerListener() {
            @Override
            public void onReady(@NonNull YouTubePlayer youTubePlayer) {
                youTubePlayer.loadVideo(videoId, 0);
            }

            @Override
            public void onError(@NonNull YouTubePlayer youTubePlayer, @NonNull PlayerConstants.PlayerError error) {
                Log.e(TAG, "Error en YouTube Player: " + error.name());
                configurarVideoExterno(ejercicio.getVideoUrl());
            }
        });
    }

    private boolean esVideoLocal(String url) {
        return url.startsWith("android.resource://") ||
                url.startsWith("file://") ||
                (!url.startsWith("http://") && !url.startsWith("https://"));
    }

    private boolean esYouTubeUrl(String url) {
        return url.contains("youtube.com") || url.contains("youtu.be");
    }

    private void configurarVideoLocal(String videoUrl) {
        try {
            mostrarVista(videoContainer);
            ocultarVista(noVideoOverlay);
            ocultarVista(externalVideoButton);

            Uri videoUri = Uri.parse(videoUrl);
            videoView.setVideoURI(videoUri);
            videoView.setOnPreparedListener(this);
            videoView.setOnCompletionListener(this);
            videoView.setOnErrorListener(this);

            configurarControlesVideo();

        } catch (Exception e) {
            Log.e(TAG, "Error configurando video local", e);
            mostrarVistaNoVideo();
        }
    }

    private void configurarVideoDirecto(String videoUrl) {
        try {
            mostrarVista(videoContainer);
            ocultarVista(noVideoOverlay);
            ocultarVista(externalVideoButton);

            Uri videoUri = Uri.parse(videoUrl);
            videoView.setVideoURI(videoUri);
            videoView.setOnPreparedListener(this);
            videoView.setOnCompletionListener(this);
            videoView.setOnErrorListener(this);

            configurarControlesVideo();

        } catch (Exception e) {
            Log.e(TAG, "Error configurando video directo", e);
            configurarVideoExterno(videoUrl);   
        }
    }

    private void configurarVideoExterno(String videoUrl) {
        ocultarVista(videoContainer);
        ocultarVista(noVideoOverlay);
        mostrarVista(externalVideoButton);

        externalVideoButton.setText("▶️ Ver en YouTube");
        externalVideoButton.setOnClickListener(v -> {
            try {
                Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(videoUrl));

                  
                intent.setPackage("com.google.android.youtube");
                if (intent.resolveActivity(requireContext().getPackageManager()) != null) {
                    startActivity(intent);
                } else {
                      
                    intent.setPackage(null);
                    startActivity(intent);
                }
            } catch (Exception e) {
                Log.e(TAG, "Error abriendo video externo", e);
                Toast.makeText(getContext(), "No se pudo abrir el video", Toast.LENGTH_SHORT).show();
            }
        });
    }

    private void mostrarVistaNoVideo() {
        ocultarVista(videoContainer);
        ocultarVista(externalVideoButton);
        mostrarVista(noVideoOverlay);
    }

    private void configurarControlesVideo() {
        btnPlayPause.setOnClickListener(v -> {
            if (isVideoReady) {
                if (isPlaying) {
                    pausarVideo();
                } else {
                    reproducirVideo();
                }
            }
        });

        seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                if (fromUser && isVideoReady) {
                    videoView.seekTo(progress);
                }
            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {}

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {}
        });
    }

    private void reproducirVideo() {
        if (videoView != null && isVideoReady) {
            videoView.start();
            isPlaying = true;
            btnPlayPause.setImageResource(R.drawable.baseline_pause_24);
            actualizarSeekBar();
        }
    }

    private void pausarVideo() {
        if (videoView != null && videoView.isPlaying()) {
            videoView.pause();
            isPlaying = false;
            btnPlayPause.setImageResource(R.drawable.baseline_play_arrow_24);
            handler.removeCallbacks(updateSeekBarTask);
        }
    }

    private void actualizarSeekBar() {
        if (isPlaying && videoView != null) {
            handler.post(updateSeekBarTask);
        }
    }

    private Runnable updateSeekBarTask = new Runnable() {
        @Override
        public void run() {
            if (videoView != null && isPlaying) {
                int currentPosition = videoView.getCurrentPosition();
                seekBar.setProgress(currentPosition);
                durationTextView.setText(formatearTiempo(currentPosition));
                handler.postDelayed(this, 1000);
            }
        }
    };

    private String formatearTiempo(int milliseconds) {
        return String.format("%02d:%02d",
                TimeUnit.MILLISECONDS.toMinutes(milliseconds),
                TimeUnit.MILLISECONDS.toSeconds(milliseconds) % 60);
    }

    private void mostrarVista(View view) {
        if (view != null) {
            view.setVisibility(View.VISIBLE);
        }
    }

    private void ocultarVista(View view) {
        if (view != null) {
            view.setVisibility(View.GONE);
        }
    }

      
    @Override
    public void onPrepared(MediaPlayer mp) {
        Log.d(TAG, "Video preparado para reproducción");
        isVideoReady = true;

        int duration = videoView.getDuration();
        seekBar.setMax(duration);
        durationTextView.setText(formatearTiempo(duration));

          
        reproducirVideo();
    }

    @Override
    public void onCompletion(MediaPlayer mp) {
        Log.d(TAG, "Video completado");
        isPlaying = false;
        btnPlayPause.setImageResource(R.drawable.baseline_play_arrow_24);
        handler.removeCallbacks(updateSeekBarTask);

          
        seekBar.setProgress(0);
        durationTextView.setText("00:00");
    }

    @Override
    public boolean onError(MediaPlayer mp, int what, int extra) {
        Log.e(TAG, "Error en video: what=" + what + ", extra=" + extra);

          
        String videoUrl = ejercicio.getVideoUrl();
        if (esYouTubeUrl(videoUrl)) {
            configurarVideoExterno(videoUrl);
        } else {
            mostrarVistaNoVideo();
        }

        return true;
    }

    @Override
    public void onPause() {
        super.onPause();
        if (videoView != null && videoView.isPlaying()) {
            pausarVideo();
        }
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        if (handler != null) {
            handler.removeCallbacks(updateSeekBarTask);
        }
        if (videoView != null) {
            videoView.stopPlayback();
        }
    }

      

    public Ejercicio getEjercicio() {
        return ejercicio;
    }

    public String getTipoEjercicio() {
        return tipoEjercicio;
    }

    public boolean tieneVideo() {
        String videoUrl = ejercicio.getVideoUrl();
        return videoUrl != null && !videoUrl.trim().isEmpty();
    }

    public boolean esEjercicioPrincipal() {
        return "principal".equals(tipoEjercicio);
    }
}