import { useEffect, useState } from 'react';
import { useDispatch } from 'react-redux';
import 'mantine-datatable/styles.css';
import { setPageTitle } from '../../store/themeConfigSlice';
import Link from 'next/link';
import Tippy from '@tippyjs/react';
import { coloredToast, progressToast, deleteToast, confirmToast } from '@/lib/toast';
import { logActivity } from '@/utils/activityLogger';
import { DataTable, type DataTableSortStatus } from '@/components/Shared/DataTable';

interface Promotion {
    id: string;
    promotion_type: string;
    promotion_name: string;
    promotion_start: Date;
    promotion_end: Date;
    promotion_is_active: boolean;
    createdAt: Date;
    promotion_used?: number;
    promotion_limit?: number;
    promotion_unique_user?: string[];
    promotion_unique_users?: string[];
    promotion_member_only?: boolean;
}


const PromotionIndex = () => {
    const dispatch = useDispatch();
    useEffect(() => {
        dispatch(setPageTitle('Promotion'));
    }, []);
    const [isMounted, setIsMounted] = useState(false);

    useEffect(() => {
        setIsMounted(true);
    }, []);

    const [isLoading, setIsLoading] = useState(true); // Add isLoading state

    const [page, setPage] = useState(1);
    const PAGE_SIZES = [5, 10, 20, 30, 50, 100];
    const [pageSize, setPageSize] = useState(PAGE_SIZES[0]);
    const [records, setRecords] = useState<Promotion[]>([]);
    const [totalRecords, setTotalRecords] = useState(0);
    const [search, setSearch] = useState('');
    const [bulkData, setBulkData] = useState<any>([]);
    const [isBulkButton, setIsBulkButton] = useState(false);
    const [sortStatus, setSortStatus] = useState<DataTableSortStatus<any>>({ columnAccessor: 'status', direction: 'asc' });
    const [typeFilter, setTypeFilter] = useState('');

    const formatPromotionType = (type?: string) => {
        if (!type) return '';
        if (type === 'category_reward') return 'Multi Product Promotion';
        return type.replaceAll('_', ' ');
    };

    const handleSortStatusChange = (newSortStatus: DataTableSortStatus<any>) => {
        setSortStatus(newSortStatus);
        if (newSortStatus.columnAccessor && newSortStatus.columnAccessor !== sortStatus.columnAccessor && page !== 1) {
            setPage(1);
        }
    };
    // Fetch data from API
    const fetchData = async () => {
        setIsLoading(true);
        try {
            let sortParam = '';
            if (sortStatus && sortStatus.columnAccessor) {
                sortParam = `&sort_by=${String(sortStatus.columnAccessor)}&sort_direction=${sortStatus.direction}`;
            }

            const typeParam = typeFilter ? `&promotion_type=${typeFilter}` : '';

            const api_url = process.env.API_URL;
            const response = await fetch(`${api_url}api/promotions/list?page=${page}&per_page=${pageSize}&q=${search}${sortParam}${typeParam}`, {
                method: 'GET',
                headers: {
                    'Content-Type': 'application/json',
                },
                credentials: 'include',
            });
            const data = await response.json();

            setPage(data.currentPage);
            setTotalRecords(data.totalData);
            setRecords(data.data);

            setIsLoading(false);
        } catch (error) {
            console.error('Error fetching data:', error);
            setIsLoading(false);
        }
    };

    useEffect(() => {
        fetchData();
        // eslint-disable-next-line react-hooks/exhaustive-deps
    }, [page, pageSize, sortStatus, typeFilter]);

    useEffect(() => {
        setPage(1);
    }, [typeFilter]);

    const deleteRow = async (id: any = null, promotion_name: string) => {
        const result = await deleteToast('Are you sure want to delete this coupon?');
        if (result) {
            try {
                const api_url = process.env.API_URL;
                const response = await fetch(`${api_url}api/promotions/delete/${id}`, {
                    method: 'DELETE',
                    headers: {
                        'Content-Type': 'application/json',
                    },
                    credentials: 'include', // Include this option
                });
                if (!response.ok) {
                    coloredToast('warning', 'Delete unsuccessfully');
                    return;
                }
                coloredToast('success', 'Delete successfully');
                await logActivity({
                    location: 'Promotion',
                    description: `Promotion - ${promotion_name} - Successfully deleted`,
                });
                fetchData();
            } catch (error) {
                console.error('Error fetching data:', error);
                await logActivity({
                    location: 'Promotion',
                    description: `Promotion - ${promotion_name} - Failed to delete`,
                });
                coloredToast('warning', 'Delete unsuccessfully');
            }
        }
    };

    const handleKeypress = (event: React.KeyboardEvent<HTMLInputElement>) => {
        if (event.keyCode === 13) {
            if (page !== 1) {
                setPage(1);
            } else {
                fetchData();
            }
        }
    };

    const changeActive = async (e: any, id: string, promotion_name: string) => {
        try {
            const api_url = process.env.API_URL;
            const response = await fetch(`${api_url}api/promotions/set-active/${id}`, {
                method: 'PATCH',
                headers: {
                    'Content-Type': 'application/json',
                },
                body: JSON.stringify({
                    is_active: e.target.checked,
                }),
                credentials: 'include', // Include this option
            });

            if (!response.ok) {
                coloredToast('warning', 'update unsuccessfully');
                return;
            }
            coloredToast('success', 'update successfully');
            await logActivity({
                location: 'Promotion',
                description: `Promotion - ${promotion_name} - Berhasil di update`,
            });
            fetchData();
        } catch (error) {
            console.error('Error fetching data:', error);
            await logActivity({
                location: 'Promotion',
                description: `Promotion - ${promotion_name} - Gagal di update`,
            });
            coloredToast('warning', 'update unsuccessfully');
        }
    };

    const handleDeleteExpiredCoupon = async (id: any, delayMs: number) => {
        const result = await deleteToast('Are you sure want to bulk delete expired coupon?');
        if (result) {
            let count = 0;
            try {
                const api_url = process.env.API_URL;

                progressToast(`Deleting Data`, count, bulkData.length);

                for (const data of bulkData) {
                    await delay(delayMs);
                    const response = await fetch(`${api_url}api/promotions/delete/${data.id}`, {
                        method: 'DELETE',
                        headers: {
                            'Content-Type': 'application/json',
                        },
                        credentials: 'include',
                    });
                    if (!response.ok) {
                        coloredToast('warning', `Some Data is not deleted`);
                    } else {
                        count++;
                        progressToast(`Deleting Data `, count, bulkData.length);
                    }
                }
                fetchData();
                setBulkData([]);
                setIsBulkButton(false);
                coloredToast('success', 'Selected data has been deleted');
                await logActivity({
                    location: 'Promotion',
                    description: `Berhasil menghapus ${count} Promotion expired`,
                });
            } catch (error) {
                console.error('Error deleting expired data:', error);
                await logActivity({
                    location: 'Promotion',
                    description: `Gagal menghapus ${count} Promotion expired`,
                });
            }
        }
    };

    const handleClone = async (id: string) => {
        const result = await confirmToast('Are you sure want to clone this promotion?', 'clone');
        if (result) {
            try {
                const api_url = process.env.API_URL;
                const response = await fetch(`${api_url}api/promotions/clone/${id}`, {
                    method: 'POST',
                    headers: {
                        'Content-Type': 'application/json',
                    },
                    credentials: 'include',
                });

                if (!response.ok) {
                    throw new Error(`Failed to clone promotion with id ${id}`);
                } else {
                    fetchData();
                    coloredToast('success', 'Promotion has been cloned successfully');
                }
            } catch (error) {
                console.error('Error cloning promotion:', error);
                coloredToast('error', 'Failed to clone promotion');
            }
        }
    };

    const delay = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));

    const getPromotionUsageAndLimit = (promotion: Promotion) => {
        const usedFromNumber = typeof promotion.promotion_used === 'number' ? promotion.promotion_used : undefined;
        const usedFromArray =
            (Array.isArray(promotion.promotion_unique_user) ? promotion.promotion_unique_user.length : 0) ||
            (Array.isArray(promotion.promotion_unique_users) ? promotion.promotion_unique_users.length : 0);

        const used = usedFromNumber ?? usedFromArray;
        const limit = typeof promotion.promotion_limit === 'number' ? promotion.promotion_limit : 0;

        return { used, limit };
    };

    return (
        <>
            {isMounted && (
                <>
                    <div className="mb-3">
                        <ul className="flex space-x-2 rtl:space-x-reverse">
                            <li>
                                <span>Promotion</span>
                            </li>
                        </ul>
                    </div>

                    <div className="panel border-white-light px-0 dark:border-[#1b2e4b]">
                        <div className="invoice-table">
                            <div className="mb-4.5 flex flex-col gap-5 px-5 md:flex-row md:items-center">
                                <div className="flex items-center gap-2">
                                    <div>
                                        <Link href="/promotions/add" className="btn btn-outline-primary gap-2">
                                            <svg className="h-5 w-5" viewBox="0 0 24 24" stroke="currentColor" strokeWidth="1.5" fill="none" strokeLinecap="round" strokeLinejoin="round">
                                                <line x1="12" y1="5" x2="12" y2="19"></line>
                                                <line x1="5" y1="12" x2="19" y2="12"></line>
                                            </svg>
                                            Add New Promotion
                                        </Link>
                                    </div>
                                    <div>
                                        {isBulkButton ? (
                                            <div>
                                                <button onClick={() => handleDeleteExpiredCoupon(bulkData, 800)} className="btn btn-outline-danger gap-2">
                                                    <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none">
                                                        <path d="M10 12V17" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" />
                                                        <path d="M14 12V17" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" />
                                                        <path d="M4 7H20" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" />
                                                        <path
                                                            d="M6 10V18C6 19.6569 7.34315 21 9 21H15C16.6569 21 18 19.6569 18 18V10"
                                                            stroke="currentColor"
                                                            strokeWidth="2"
                                                            strokeLinecap="round"
                                                            strokeLinejoin="round"
                                                        />
                                                        <path
                                                            d="M9 5C9 3.89543 9.89543 3 11 3H13C14.1046 3 15 3.89543 15 5V7H9V5Z"
                                                            stroke="currentColor"
                                                            strokeWidth="2"
                                                            strokeLinecap="round"
                                                            strokeLinejoin="round"
                                                        />
                                                    </svg>
                                                    Delete {`${bulkData.length}`} Expired Flash Sale
                                                </button>
                                            </div>
                                        ) : null}
                                    </div>
                                </div>
                                <div className="flex flex-wrap items-center gap-2 ltr:ml-auto rtl:mr-auto">
                                    <select
                                        className="form-select w-auto"
                                        value={typeFilter}
                                        onChange={(e) => setTypeFilter(e.target.value)}
                                    >
                                        <option value="">All Types</option>
                                        <option value="birthday">Birthday</option>
                                        <option value="qty_of_cart">Qty of Cart</option>
                                        <option value="subtotal_of_cart">Subtotal of Cart</option>
                                        <option value="category_reward">Multi Product Promotion</option>
                                    </select>
                                    <input
                                        type="text"
                                        className="form-input w-auto"
                                        placeholder="Search Promotion Name"
                                        value={search}
                                        onChange={(e) => setSearch(e.target.value)}
                                        onKeyDown={handleKeypress}
                                    />
                                </div>
                            </div>
                            <div className="datatables pagination-padding">
                                {isLoading ? (
                                    // Show loading indicator here
                                    <div className="flex justify-center py-4 text-center">
                                        <svg
                                            viewBox="0 0 24 24"
                                            width="24"
                                            height="24"
                                            stroke="currentColor"
                                            strokeWidth="1.5"
                                            fill="none"
                                            strokeLinecap="round"
                                            strokeLinejoin="round"
                                            className="h-5 w-5 animate-spin text-white-dark"
                                        >
                                            <line x1="12" y1="2" x2="12" y2="6"></line>
                                            <line x1="12" y1="18" x2="12" y2="22"></line>
                                            <line x1="4.93" y1="4.93" x2="7.76" y2="7.76"></line>
                                            <line x1="16.24" y1="16.24" x2="19.07" y2="19.07"></line>
                                            <line x1="2" y1="12" x2="6" y2="12"></line>
                                            <line x1="18" y1="12" x2="22" y2="12"></line>
                                            <line x1="4.93" y1="19.07" x2="7.76" y2="16.24"></line>
                                            <line x1="16.24" y1="7.76" x2="19.07" y2="4.93"></line>
                                        </svg>
                                        <span className="ms-3">Please wait, we&apos;re still working to load the data...</span>
                                    </div>
                                ) : (
                                    <DataTable
                                        className="table-hover whitespace-nowrap"
                                        records={records}
                                        minHeight={250}
                                        withTableBorder
                                        selectedRecords={bulkData}
                                        onSelectedRecordsChange={(selectedRecords) => {
                                            setBulkData(selectedRecords);
                                            setIsBulkButton(selectedRecords.length > 0);
                                        }}
                                        isRecordSelectable={(record) => {
                                            if (!record.promotion_end) return false;
                                            const currentDate = new Date();
                                            const endDate = new Date(record.promotion_end);
                                            return currentDate > endDate;
                                        }}
                                        noRecordsText="No data found"
                                        sortStatus={sortStatus}
                                        onSortStatusChange={handleSortStatusChange}
                                        columns={[
                                            {
                                                accessor: 'promotion_name',
                                                sortable: true,
                                                render: ({ id, promotion_name }) => {
                                                    const isClone = promotion_name.includes(' - clone');
                                                    const displayName = isClone ? promotion_name.replace(' - clone', '') : promotion_name;
                                                    return (
                                                        <div className="font-semibold">
                                                            <Link href={`/promotions/edit/${id}`} className="hover:text-info">
                                                            {displayName}
                                                            {isClone && <span className="ml-1 text-green-500">- clone</span>}
                                                            </Link>
                                                        </div>
                                                    );
                                                },
                                            },

                                            {
                                                accessor: 'type',
                                                render: ({ promotion_type }) => <div className="capitalize">{formatPromotionType(promotion_type)}</div>,
                                            },
                                            {
                                                accessor: 'audience',
                                                title: 'Audience',
                                                render: ({ promotion_member_only }) => {
                                                    const isMemberOnly = Boolean(promotion_member_only);
                                                    return (
                                                        <div
                                                            className={
                                                                isMemberOnly
                                                                    ? 'badge badge-outline-warning w-fit'
                                                                    : 'badge badge-outline-primary w-fit'
                                                            }
                                                        >
                                                            {isMemberOnly ? 'Member Only' : 'Universal'}
                                                        </div>
                                                    );
                                                },
                                            },
                                            {
                                                accessor: 'created date',
                                                render: ({ createdAt }) => {
                                                    const createdAtDate = new Date(createdAt);
                                                    const formattedDate = createdAtDate.toLocaleDateString('id-ID'); // Format the date
                                                    const formattedTime = createdAtDate.toLocaleTimeString('id-ID'); // Format the time
                                                    return (
                                                        <>
                                                            <div className="text-xs">
                                                                <div>{formattedDate}</div>
                                                                <div>{formattedTime}</div>
                                                            </div>
                                                        </>
                                                    ); // Render the formatted date and time
                                                },
                                            },
                                            {
                                                accessor: 'usage / limit',
                                                render: (promotion) => {
                                                    const { used, limit } = getPromotionUsageAndLimit(promotion as Promotion);
                                                    return (
                                                        <>
                                                            {used} / {limit === 0 ? '\u221E' : limit}
                                                        </>
                                                    );
                                                },
                                            },

                                            {
                                                accessor: 'status',
                                                sortable: true,
                                                render: ({ promotion_start, promotion_end }) => {
                                                    const currentDate = new Date();
                                                    let status = 'running'; // Default status is 'running'

                                                    if (promotion_end) {
                                                        const endDate = new Date(promotion_end);
                                                        if (endDate < currentDate) {
                                                            status = 'expired';
                                                        }
                                                    }

                                                    if (promotion_start) {
                                                        const startDate = new Date(promotion_start);
                                                        if (startDate > currentDate) {
                                                            status = 'scheduled';
                                                        }
                                                    }

                                                    // Define CSS classes based on the status
                                                    let statusClass = 'badge badge-outline-success w-fit';
                                                    if (status === 'expired') {
                                                        statusClass = 'badge badge-outline-danger  w-fit';
                                                    } else if (status === 'scheduled') {
                                                        statusClass = 'badge badge-outline-warning w-fit';
                                                    }

                                                    // Return the status element with the appropriate styling
                                                    return <div className={statusClass}>{status}</div>;
                                                },
                                            },
                                            {
                                                accessor: 'is_active',
                                                render: ({ id, promotion_is_active, promotion_name }) => (
                                                    <label className="relative h-6 w-12">
                                                        <input
                                                            type="checkbox"
                                                            checked={promotion_is_active}
                                                            onChange={(e) => changeActive(e, id, promotion_name)}
                                                            className="custom_switch peer absolute z-10 h-full w-full cursor-pointer opacity-0"
                                                            id="active_promotion"
                                                        />
                                                        <span className="block h-full rounded-full bg-[#ebedf2] before:absolute before:bottom-1 before:left-1 before:h-4 before:w-4 before:rounded-full before:bg-white before:transition-all before:duration-300 peer-checked:bg-primary peer-checked:before:left-7 dark:bg-dark dark:before:bg-white-dark dark:peer-checked:before:bg-white"></span>
                                                    </label>
                                                ),
                                            },
                                            {
                                                accessor: 'action',
                                                title: 'Actions',
                                                textAlign: 'center',
                                                render: ({ id, promotion_name }) => (
                                                    <div className="mx-auto flex w-max items-center gap-4">
                                                        <Tippy content="Clone">
                                                            <span className="inline-flex">
                                                                <button onClick={() => handleClone(id)} className="flex hover:text-success">
                                                                    <svg
                                                                        className="h-6 w-6 text-gray-600 dark:text-white"
                                                                        aria-hidden="true"
                                                                        xmlns="http://www.w3.org/2000/svg"
                                                                        width="24"
                                                                        height="24"
                                                                        fill="none"
                                                                        viewBox="0 0 24 24"
                                                                    >
                                                                        <path
                                                                            stroke="currentColor"
                                                                            strokeLinejoin="round"
                                                                            strokeWidth="1.2"
                                                                            d="M15 4v3a1 1 0 0 1-1 1h-3m2 10v1a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1v-7.13a1 1 0 0 1 .24-.65L6.7 8.35A1 1 0 0 1 7.46 8H9m-1 4H4m16-7v10a1 1 0 0 1-1 1h-7a1 1 0 0 1-1-1V7.87a1 1 0 0 1 .24-.65l2.46-2.87a1 1 0 0 1 .76-.35H19a1 1 0 0 1 1 1Z"
                                                                        />
                                                                    </svg>
                                                                </button>
                                                            </span>
                                                        </Tippy>
                                                        <Tippy content="Edit">
                                                            <span className="inline-flex">
                                                                <Link href={`/promotions/edit/${id}`} className="flex hover:text-info">
                                                                    <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" className="h-4.5 w-4.5">
                                                                        <path
                                                                            opacity="0.5"
                                                                            d="M22 10.5V12C22 16.714 22 19.0711 20.5355 20.5355C19.0711 22 16.714 22 12 22C7.28595 22 4.92893 22 3.46447 20.5355C2 19.0711 2 16.714 2 12C2 7.28595 2 4.92893 3.46447 3.46447C4.92893 2 7.28595 2 12 2H13.5"
                                                                            stroke="currentColor"
                                                                            strokeWidth="1.5"
                                                                            strokeLinecap="round"
                                                                        ></path>
                                                                        <path
                                                                            d="M17.3009 2.80624L16.652 3.45506L10.6872 9.41993C10.2832 9.82394 10.0812 10.0259 9.90743 10.2487C9.70249 10.5114 9.52679 10.7957 9.38344 11.0965C9.26191 11.3515 9.17157 11.6225 8.99089 12.1646L8.41242 13.9L8.03811 15.0229C7.9492 15.2897 8.01862 15.5837 8.21744 15.7826C8.41626 15.9814 8.71035 16.0508 8.97709 15.9619L10.1 15.5876L11.8354 15.0091C12.3775 14.8284 12.6485 14.7381 12.9035 14.6166C13.2043 14.4732 13.4886 14.2975 13.7513 14.0926C13.9741 13.9188 14.1761 13.7168 14.5801 13.3128L20.5449 7.34795L21.1938 6.69914C22.2687 5.62415 22.2687 3.88124 21.1938 2.80624C20.1188 1.73125 18.3759 1.73125 17.3009 2.80624Z"
                                                                            stroke="currentColor"
                                                                            strokeWidth="1.5"
                                                                        ></path>
                                                                        <path
                                                                            opacity="0.5"
                                                                            d="M16.6522 3.45508C16.6522 3.45508 16.7333 4.83381 17.9499 6.05034C19.1664 7.26687 20.5451 7.34797 20.5451 7.34797M10.1002 15.5876L8.4126 13.9"
                                                                            stroke="currentColor"
                                                                            strokeWidth="1.5"
                                                                        ></path>
                                                                    </svg>
                                                                </Link>
                                                            </span>
                                                        </Tippy>
                                                        <Tippy content="Delete">
                                                            <span className="inline-flex">
                                                                <button type="button" className="flex hover:text-danger" onClick={(e) => deleteRow(id, promotion_name)}>
                                                                    <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" className="h-5 w-5">
                                                                        <path d="M20.5001 6H3.5" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round"></path>
                                                                        <path
                                                                            d="M18.8334 8.5L18.3735 15.3991C18.1965 18.054 18.108 19.3815 17.243 20.1907C16.378 21 15.0476 21 12.3868 21H11.6134C8.9526 21 7.6222 21 6.75719 20.1907C5.89218 19.3815 5.80368 18.054 5.62669 15.3991L5.16675 8.5"
                                                                            stroke="currentColor"
                                                                            strokeWidth="1.5"
                                                                            strokeLinecap="round"
                                                                        ></path>
                                                                        <path opacity="0.5" d="M9.5 11L10 16" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round"></path>
                                                                        <path opacity="0.5" d="M14.5 11L14 16" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round"></path>
                                                                        <path
                                                                            opacity="0.5"
                                                                            d="M6.5 6C6.55588 6 6.58382 6 6.60915 5.99936C7.43259 5.97849 8.15902 5.45491 8.43922 4.68032C8.44784 4.65649 8.45667 4.62999 8.47434 4.57697L8.57143 4.28571C8.65431 4.03708 8.69575 3.91276 8.75071 3.8072C8.97001 3.38607 9.37574 3.09364 9.84461 3.01877C9.96213 3 10.0932 3 10.3553 3H13.6447C13.9068 3 14.0379 3 14.1554 3.01877C14.6243 3.09364 15.03 3.38607 15.2493 3.8072C15.3043 3.91276 15.3457 4.03708 15.4286 4.28571L15.5257 4.57697C15.5433 4.62992 15.5522 4.65651 15.5608 4.68032C15.841 5.45491 16.5674 5.97849 17.3909 5.99936C17.4162 6 17.4441 6 17.5 6"
                                                                            stroke="currentColor"
                                                                            strokeWidth="1.5"
                                                                        ></path>
                                                                    </svg>
                                                                </button>
                                                            </span>
                                                        </Tippy>
                                                    </div>
                                                ),
                                            },
                                        ]}
                                        highlightOnHover
                                        totalRecords={totalRecords}
                                        recordsPerPage={pageSize}
                                        page={page}
                                        onPageChange={(p) => setPage(p)}
                                        recordsPerPageOptions={PAGE_SIZES}
                                        onRecordsPerPageChange={setPageSize}
                                        paginationText={({ from, to, totalRecords }) => `Showing  ${from} to ${to} of ${totalRecords} promotions`}
                                    />
                                )}
                            </div>
                        </div>
                    </div>
                </>
            )}
        </>
    );
};

export default PromotionIndex;
