// react
import React, { useEffect, useRef, useState } from "react";
// application
import Decor from "~/components/shared/Decor";
import FooterContacts from "~/components/footer/FooterContacts";
import FooterLinks from "~/components/footer/FooterLinks";
import FooterNewsletter from "~/components/footer/FooterNewsletter";
import { getDefaultFooterSettings } from "~/data/footerDefaults";
import { URL_API } from "~/constants";
import { IFooterSettings } from "~/interfaces/footerSettings";
import { ILink } from "~/interfaces/link";
import { toast } from "react-toastify";

export function Footer() {
    const [sucursales, setSucursales] = useState<ILink[]>([]);
    const [footerSettings, setFooterSettings] = useState<IFooterSettings>(() => getDefaultFooterSettings());

    // ===== Boton de WhatsApp arrastrable =====
    const STORAGE_KEY = "whatsapp-floating-position";
    const whatsappBtnRef = useRef<HTMLAnchorElement | null>(null);
    const dragStateRef = useRef({ dragging: false, moved: false, startX: 0, startY: 0, originX: 0, originY: 0 });
    // null = usar posicion por defecto (bottom/right del CSS)
    const [waPos, setWaPos] = useState<{ x: number; y: number } | null>(null);

    // Cargar posicion guardada (solo cliente)
    useEffect(() => {
        try {
            const saved = window.localStorage.getItem(STORAGE_KEY);
            if (saved) {
                const parsed = JSON.parse(saved) as { x: number; y: number };
                if (typeof parsed.x === "number" && typeof parsed.y === "number") {
                    setWaPos(clampWaPosition(parsed.x, parsed.y));
                }
            }
        } catch {
            // sin posicion guardada
        }
    }, []);

    function clampWaPosition(x: number, y: number): { x: number; y: number } {
        const size = 48; // tamano aproximado del boton
        const maxX = Math.max(0, window.innerWidth - size);
        const maxY = Math.max(0, window.innerHeight - size);
        return { x: Math.min(Math.max(x, 0), maxX), y: Math.min(Math.max(y, 0), maxY) };
    }

    const handleWaPointerDown = (e: React.PointerEvent<HTMLAnchorElement>) => {
        const btn = whatsappBtnRef.current;
        if (!btn) return;
        const rect = btn.getBoundingClientRect();
        dragStateRef.current = {
            dragging: true,
            moved: false,
            startX: e.clientX,
            startY: e.clientY,
            originX: rect.left,
            originY: rect.top,
        };
        btn.setPointerCapture(e.pointerId);
    };

    const handleWaPointerMove = (e: React.PointerEvent<HTMLAnchorElement>) => {
        const state = dragStateRef.current;
        if (!state.dragging) return;
        const dx = e.clientX - state.startX;
        const dy = e.clientY - state.startY;
        if (!state.moved && Math.abs(dx) < 5 && Math.abs(dy) < 5) return; // tolerancia antes de arrastrar
        state.moved = true;
        setWaPos(clampWaPosition(state.originX + dx, state.originY + dy));
    };

    const handleWaPointerEnd = (e: React.PointerEvent<HTMLAnchorElement>) => {
        const state = dragStateRef.current;
        if (!state.dragging) return;
        state.dragging = false;
        try {
            whatsappBtnRef.current?.releasePointerCapture(e.pointerId);
        } catch {
            // el puntero ya se libero
        }
        setWaPos((pos) => {
            if (pos) {
                try {
                    window.localStorage.setItem(STORAGE_KEY, JSON.stringify(pos));
                } catch {
                    // almacenamiento no disponible
                }
            }
            return pos;
        });
    };

    const handleWaClick = (e: React.MouseEvent<HTMLAnchorElement>) => {
        // Si fue un arrastre, no abrir WhatsApp
        if (dragStateRef.current.moved) {
            e.preventDefault();
            dragStateRef.current.moved = false;
        }
    };
    // ===== Fin boton arrastrable =====

    useEffect(() => {
        const loadFooter = async () => {
            try {
                const res = await fetch(`${URL_API}/footer-settings`);
                if (!res.ok) {
                    return;
                }
                const data = (await res.json()) as IFooterSettings;
                if (data && typeof data.contactTitle === "string") {
                    setFooterSettings({ ...getDefaultFooterSettings(), ...data });
                }
            } catch (error) {
                console.error(error);
            }
        };
        loadFooter();
    }, []);

    useEffect(() => {
        const getSucursales = async () => {
            try {
                const res = await fetch(`${URL_API}/sucursal`);
                const data = await res.json();
                setSucursales(
                    data.map((sucursal: any) => ({
                        title: sucursal.name,
                        url: sucursal.url,
                    })),
                );
            } catch (error) {
                console.error(error);
                toast.error("Error al obtener las sucursales");
            }
        };
        getSucursales();
    }, []);

    const whatsappNumber = "584124696003";
    const whatsappUrl = `https://wa.me/${whatsappNumber}?text=Hola,%20deseo%20información.`;

    return (
        <div className="site-footer">
            <div className="site-footer__widgets">
                <div className="container">
                    <div className="row">
                        <div className="col-12 col-xl-5">
                            <FooterContacts className="site-footer__widget" settings={footerSettings} />
                        </div>

                        <div className="col-12 col-md-6 col-xl-3">
                            <FooterLinks
                                className="site-footer__widget"
                                header={<p>Sucursales</p>}
                                links={sucursales}
                            />
                        </div>

                        <div className="col-12 col-md-6 col-xl-4">
                            <FooterNewsletter
                                className="site-footer__widget"
                                socialSectionTitle={footerSettings.socialSectionTitle}
                                socialLinks={footerSettings.socialLinks}
                            />
                        </div>
                    </div>
                </div>
            </div>

            <a
                href={whatsappUrl}
                target="_blank"
                rel="noopener noreferrer"
                ref={whatsappBtnRef}
                className="whatsapp-floating-button"
                aria-label="Chat on WhatsApp"
                style={
                    waPos
                        ? { top: `${waPos.y}px`, left: `${waPos.x}px`, right: "auto", bottom: "auto" }
                        : undefined
                }
                onPointerDown={handleWaPointerDown}
                onPointerMove={handleWaPointerMove}
                onPointerUp={handleWaPointerEnd}
                onPointerCancel={handleWaPointerEnd}
                onClick={handleWaClick}
            >
                <svg width="25" height="25" fill="currentColor" viewBox="0 0 16 16">
                    <path d="M13.601 2.326A7.854 7.854 0 0 0 7.994 0C3.627 0 .068 3.558.064 7.926c0 1.399.366 2.76 1.057 3.965L0 16l4.204-1.102a7.933 7.933 0 0 0 3.79.965h.004c4.368 0 7.926-3.558 7.93-7.93A7.898 7.898 0 0 0 13.6 2.326zM7.994 14.521a6.573 6.573 0 0 1-3.356-.92l-.24-.144-2.494.654.666-2.433-.156-.251a6.56 6.56 0 0 1-1.007-3.505c0-3.626 2.957-6.584 6.591-6.584a6.56 6.56 0 0 1 4.66 1.931 6.557 6.557 0 0 1 1.928 4.66c-.004 3.639-2.961 6.592-6.592 6.592zm3.615-4.934c-.197-.099-1.17-.578-1.353-.646-.182-.065-.315-.099-.445.099-.133.197-.513.646-.627.775-.114.133-.232.148-.43.05-.197-.1-.836-.308-1.592-.985-.59-.525-.985-1.175-1.103-1.372-.114-.198-.011-.304.088-.403.087-.088.197-.232.296-.346.1-.114.133-.198.198-.33.065-.134.034-.248-.015-.347-.05-.099-.445-1.076-.612-1.47-.16-.389-.323-.335-.445-.34-.114-.007-.247-.007-.38-.007a.729.729 0 0 0-.529.247c-.182.198-.691.677-.691 1.654 0 .977.71 1.916.81 2.049.098.133 1.394 2.132 3.383 2.992.47.205.84.326 1.129.418.475.152.904.129 1.246.08.38-.058 1.171-.48 1.338-.943.164-.464.164-.86.114-.943-.049-.084-.182-.133-.38-.232z" />
                </svg>
            </a>

            <style jsx>{`
                .whatsapp-floating-button {
                    position: fixed;
                    width: 40px;
                    height: 40px;
                    bottom: 40px;
                    right: 40px;
                    background-color: #25d366;
                    color: #fff;
                    border-radius: 50px;
                    text-align: center;
                    font-size: 30px;
                    box-shadow: 2px 2px 3px #999;
                    z-index: 1000;
                    display: flex;
                    align-items: center;
                    justify-content: center;
                    text-decoration: none;
                    transition: transform 0.3s ease;
                    touch-action: none;
                    user-select: none;
                    cursor: grab;
                }

                .whatsapp-floating-button:active {
                    cursor: grabbing;
                }

                .whatsapp-floating-button:hover {
                    transform: scale(1.3) rotate(10deg);
                }

                @media (max-width: 991px) {
                    .whatsapp-floating-button {
                        bottom: 95px;
                    }
                }
            `}</style>
        </div>
    );
}

export default React.memo(Footer);
