import React, { useState, useEffect } from 'react';
import { Head, Link, router, usePage } from '@inertiajs/react';
import AuthenticatedLayout from '@/Layouts/AuthenticatedLayout';
import { Invoice, PageProps } from '@/types';
import {
  Receipt,
  Search,
  Eye,
  Printer,
  Ban,
  CheckCircle2,
  AlertOctagon,
  Clock,
  Filter,
  X,
  Trash2
} from '@/Components/AnimatedIcons';

interface Props {
  invoices: {
    data: Invoice[];
    links: any[];
    current_page: number;
    last_page: number;
  };
  filters: {
    search?: string;
    status?: string;
    branch_id?: string;
    start_date?: string;
    end_date?: string;
  };
}

export default function InvoicesIndex({ invoices, filters }: Props) {
  const { auth } = usePage<PageProps>().props;
  const user = auth.user;

  const [search, setSearch] = useState(filters.search || '');
  const [status, setStatus] = useState(filters.status || '');
  const [startDate, setStartDate] = useState(filters.start_date || '');
  const [endDate, setEndDate] = useState(filters.end_date || '');

  // Void Modal State
  const [selectedInvoice, setSelectedInvoice] = useState<Invoice | null>(null);
  const [voidReason, setVoidReason] = useState('');
  const [showVoidModal, setShowVoidModal] = useState(false);
  const [voidMode, setVoidMode] = useState<'REQUEST' | 'APPROVE'>('REQUEST');

  // Active theme accent state (Pink vs SeaGreen)
  const [accent, setAccent] = useState<'pink' | 'seagreen'>(() => {
    if (typeof window !== 'undefined') {
      return (localStorage.getItem('admin_accent_color') as any) || 'pink';
    }
    return 'pink';
  });

  useEffect(() => {
    const handler = () => {
      const current = (localStorage.getItem('admin_accent_color') as any) || 'pink';
      setAccent(current);
    };
    window.addEventListener('theme_accent_changed', handler);
    return () => window.removeEventListener('theme_accent_changed', handler);
  }, []);

  const isPink = accent === 'pink';

  const accentText = isPink ? 'text-[#FF0D8F] dark:text-[#FF4DB8]' : 'text-[#0CA996] dark:text-[#00C8B2]';
  const accentBg = isPink ? 'bg-[#FF0D8F]' : 'bg-[#0CA996]';
  const accentHoverBg = isPink ? 'hover:bg-[#E0067B]' : 'hover:bg-[#098777]';

  const handleFilter = (e: React.FormEvent) => {
    e.preventDefault();
    router.get(route('invoices.index'), {
      search,
      status,
      start_date: startDate,
      end_date: endDate,
    }, { preserveState: true });
  };

  const resetFilters = () => {
    setSearch('');
    setStatus('');
    setStartDate('');
    setEndDate('');
    router.get(route('invoices.index'));
  };

  const openVoidModal = (invoice: Invoice, mode: 'REQUEST' | 'APPROVE') => {
    setSelectedInvoice(invoice);
    setVoidReason('');
    setVoidMode(mode);
    setShowVoidModal(true);
  };

  const submitVoid = () => {
    if (!selectedInvoice) return;
    if (!voidReason.trim()) return;

    if (voidMode === 'REQUEST') {
      router.post(route('invoices.void-request', selectedInvoice.id), {
        reason: voidReason,
      }, {
        onSuccess: () => setShowVoidModal(false),
      });
    } else {
      router.post(route('invoices.void-approve', selectedInvoice.id), {
        reason: voidReason,
      }, {
        onSuccess: () => setShowVoidModal(false),
      });
    }
  };

  const handleDelete = (id: number) => {
    if (confirm('Are you sure you want to permanently delete this invoice? This cannot be undone.')) {
      router.delete(route('invoices.destroy', id));
    }
  };

  return (
    <AuthenticatedLayout>
      <Head title="Invoices Ledger - Cakes & Candles" />

      <div className="space-y-6">
        {/* Header */}
        <div className="flex flex-col md:flex-row md:items-center justify-between gap-4">
          <div>
            <h1 className="text-2xl font-extrabold text-slate-900 dark:text-white  flex items-center space-x-2">
              <Receipt className={`w-7 h-7 ${accentText}`} />
              <span>Invoices Ledger</span>
            </h1>
            <p className="text-xs text-slate-500 dark:text-slate-400 font-semibold mt-0.5">
              Historical sales transaction receipts, void requests & print ledger
            </p>
          </div>

          <Link
            href={route('pos.index')}
            className={`px-4 py-2.5 ${accentBg} ${accentHoverBg} text-white font-bold text-xs rounded-xl shadow transition-all self-start flex items-center space-x-1.5`}
          >
            <span>+ Create New Bill in POS</span>
          </Link>
        </div>

        {/* Filter Bar */}
        <form onSubmit={handleFilter} className="bg-white dark:bg-slate-900 p-4 rounded-2xl border border-slate-200/80 dark:border-slate-800 shadow-2xs grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-5 gap-3 items-end">
          <div>
            <label className="block text-[11px] font-bold uppercase text-slate-600 dark:text-slate-400 mb-1">Search Invoice / Mobile</label>
            <div className="relative">
              <Search className="w-4 h-4 absolute left-3 top-2.5 text-slate-400" />
              <input
                type="text"
                value={search}
                onChange={(e) => setSearch(e.target.value)}
                placeholder="INV # or mobile"
                className="w-full pl-9 pr-3 py-1.5 border border-slate-200 dark:border-slate-700 bg-white dark:bg-slate-800 rounded-xl text-xs font-medium text-slate-900 dark:text-white"
              />
            </div>
          </div>

          <div>
            <label className="block text-[11px] font-bold uppercase text-slate-600 dark:text-slate-400 mb-1">Bill Status</label>
            <select
              value={status}
              onChange={(e) => setStatus(e.target.value)}
              className="w-full p-1.5 border border-slate-200 dark:border-slate-700 rounded-xl text-xs font-bold text-slate-900 dark:text-white bg-slate-50 dark:bg-slate-800"
            >
              <option value="">All Statuses</option>
              <option value="CONFIRMED">CONFIRMED</option>
              <option value="VOID_REQUESTED">VOID REQUESTED</option>
              <option value="VOIDED">VOIDED</option>
            </select>
          </div>

          <div>
            <label className="block text-[11px] font-bold uppercase text-slate-600 dark:text-slate-400 mb-1">Start Date</label>
            <input
              type="date"
              value={startDate}
              onChange={(e) => setStartDate(e.target.value)}
              className="w-full p-1.5 border border-slate-200 dark:border-slate-700 bg-white dark:bg-slate-800 rounded-xl text-xs font-medium text-slate-900 dark:text-white"
            />
          </div>

          <div>
            <label className="block text-[11px] font-bold uppercase text-slate-600 dark:text-slate-400 mb-1">End Date</label>
            <input
              type="date"
              value={endDate}
              onChange={(e) => setEndDate(e.target.value)}
              className="w-full p-1.5 border border-slate-200 dark:border-slate-700 bg-white dark:bg-slate-800 rounded-xl text-xs font-medium text-slate-900 dark:text-white"
            />
          </div>

          <div className="flex space-x-2">
            <button
              type="submit"
              className={`flex-1 py-2 ${accentBg} ${accentHoverBg} text-white font-bold text-xs rounded-xl shadow`}
            >
              Filter
            </button>
            <button
              type="button"
              onClick={resetFilters}
              className="py-2 px-3 bg-slate-100 dark:bg-slate-800 hover:bg-slate-200 dark:hover:bg-slate-700 text-slate-600 dark:text-slate-300 font-bold text-xs rounded-xl"
            >
              Reset
            </button>
          </div>
        </form>

        {/* Table */}
        <div className="bg-white dark:bg-slate-900 rounded-2xl border border-slate-200/80 dark:border-slate-800 shadow-2xs overflow-hidden">
          <div className="overflow-x-auto">
            <table className="w-full text-left text-xs">
              <thead className="bg-slate-100 dark:bg-slate-950 text-slate-600 dark:text-slate-300  uppercase tracking-wider text-[11px]">
                <tr>
                  <th className="p-3.5">Invoice #</th>
                  <th className="p-3.5">Date & Time</th>
                  <th className="p-3.5">Branch</th>
                  <th className="p-3.5">Customer</th>
                  <th className="p-3.5">Payment Method</th>
                  <th className="p-3.5 text-right">Grand Total</th>
                  <th className="p-3.5 text-center">Status</th>
                  <th className="p-3.5 text-center">Actions</th>
                </tr>
              </thead>
              <tbody className="divide-y divide-slate-100 dark:divide-slate-800">
                {invoices.data.map((inv) => (
                  <tr key={inv.id} className="hover:bg-slate-50 dark:hover:bg-slate-800/50 transition-colors">
                    <td className={`p-3.5 font-extrabold ${accentText}`}>
                      {inv.invoice_number}
                    </td>
                    <td className="p-3.5 font-medium text-slate-600 dark:text-slate-400">
                      {new Date(inv.issued_at).toLocaleString()}
                    </td>
                    <td className="p-3.5 font-semibold text-slate-800 dark:text-slate-200">
                      {inv.branch?.name || 'Main Branch'}
                    </td>
                    <td className="p-3.5 font-semibold text-slate-800 dark:text-slate-200">
                      {inv.customer ? (
                        <div>
                          <span className="block">{inv.customer.name}</span>
                          <span className="text-[10px] text-slate-400 font-normal">{inv.customer.mobile}</span>
                        </div>
                      ) : (
                        <span className="text-slate-400 italic">Walk-in</span>
                      )}
                    </td>
                    <td className="p-3.5">
                      <div className="flex gap-1 flex-wrap">
                        {inv.payments?.map((p, idx) => (
                          <span key={idx} className="bg-slate-100 dark:bg-slate-800 text-slate-700 dark:text-slate-300 px-2 py-0.5 rounded text-[10px] font-bold">
                            {p.payment_method} ₹{Number(p.amount).toFixed(0)}
                          </span>
                        ))}
                      </div>
                    </td>
                    <td className="p-3.5 text-right font-extrabold text-slate-900 dark:text-white text-sm">
                      ₹{Number(inv.grand_total).toFixed(2)}
                    </td>
                    <td className="p-3.5 text-center">
                      {inv.status === 'CONFIRMED' && (
                        <span className="bg-emerald-50 dark:bg-emerald-950/40 text-emerald-700 dark:text-emerald-400 border border-emerald-200 dark:border-emerald-800 px-2.5 py-1 rounded-full text-[10px] font-bold flex items-center justify-center space-x-1 w-24 mx-auto">
                          <CheckCircle2 className="w-3 h-3" />
                          <span>CONFIRMED</span>
                        </span>
                      )}
                      {inv.status === 'VOID_REQUESTED' && (
                        <span className="bg-amber-50 dark:bg-amber-950/40 text-amber-700 dark:text-amber-400 border border-amber-200 dark:border-amber-800 px-2.5 py-1 rounded-full text-[10px] font-bold flex items-center justify-center space-x-1 w-28 mx-auto">
                          <Clock className="w-3 h-3" />
                          <span>VOID REQUEST</span>
                        </span>
                      )}
                      {inv.status === 'VOIDED' && (
                        <span className="bg-rose-50 dark:bg-rose-950/40 text-rose-700 dark:text-rose-400 border border-rose-200 dark:border-rose-800 px-2.5 py-1 rounded-full text-[10px] font-bold flex items-center justify-center space-x-1 w-24 mx-auto">
                          <AlertOctagon className="w-3 h-3" />
                          <span>VOIDED</span>
                        </span>
                      )}
                    </td>
                    <td className="p-3.5 text-center">
                      <div className="flex items-center justify-center space-x-2">
                        <Link
                          href={route('invoices.show', inv.id)}
                          className="p-1.5 text-slate-500 dark:text-slate-400 hover:text-slate-900 dark:hover:text-white hover:bg-slate-100 dark:hover:bg-slate-800 rounded-lg transition-colors"
                          title="View & Print Invoice"
                        >
                          <Printer className="w-4 h-4" />
                        </Link>

                        {inv.status === 'CONFIRMED' && !user?.is_admin && (
                          <button
                            onClick={() => openVoidModal(inv, 'REQUEST')}
                            className="p-1.5 text-rose-600 hover:bg-rose-50 dark:hover:bg-rose-950/40 rounded-lg transition-colors"
                            title="Request Bill Void"
                          >
                            <Ban className="w-4 h-4" />
                          </button>
                        )}

                        {(inv.status === 'VOID_REQUESTED' || (inv.status === 'CONFIRMED' && user?.is_admin)) && user?.is_admin && (
                          <button
                            onClick={() => openVoidModal(inv, 'APPROVE')}
                            className="px-2 py-1 bg-rose-600 hover:bg-rose-700 text-white rounded-lg text-[10px] font-bold shadow"
                          >
                            Authorize Void
                          </button>
                        )}

                        {user?.is_admin && (
                          <button
                            onClick={() => handleDelete(inv.id)}
                            className="p-1.5 text-rose-500 hover:bg-rose-50 dark:hover:bg-rose-900/30 rounded-lg transition-colors"
                            title="Delete Permanently"
                          >
                            <Trash2 className="w-4 h-4" />
                          </button>
                        )}
                      </div>
                    </td>
                  </tr>
                ))}

                {invoices.data.length === 0 && (
                  <tr>
                    <td colSpan={8} className="p-12 text-center text-slate-400">
                      No invoices found matching current filters.
                    </td>
                  </tr>
                )}
              </tbody>
            </table>
          </div>
        </div>
      </div>

      {/* VOID MODAL */}
      {showVoidModal && selectedInvoice && (
        <div className="fixed inset-0 z-50 bg-slate-950/60 backdrop-blur-sm flex items-center justify-center p-4">
          <div className="bg-white dark:bg-slate-900 border border-slate-200 dark:border-slate-800 rounded-2xl max-w-md w-full p-6 shadow-2xl space-y-4">
            <div className="flex justify-between items-center border-b border-slate-100 dark:border-slate-800 pb-3">
              <h3 className="font-bold text-base text-rose-900 dark:text-rose-200 flex items-center space-x-2">
                <AlertOctagon className="w-5 h-5 text-rose-600 dark:text-rose-400" />
                <span>
                  {voidMode === 'REQUEST' ? 'Request Invoice Void' : 'Authorize Invoice Cancellation'}
                </span>
              </h3>
              <button onClick={() => setShowVoidModal(false)} className="text-slate-400 hover:text-slate-600 dark:hover:text-slate-200">
                <X className="w-5 h-5" />
              </button>
            </div>

            <div className="text-xs space-y-2 bg-slate-50 dark:bg-slate-800/60 p-3 rounded-xl border border-slate-200 dark:border-slate-700">
              <div>
                <span className="text-slate-500 dark:text-slate-400 font-medium">Invoice Number: </span>
                <span className="font-bold text-slate-900 dark:text-white">{selectedInvoice.invoice_number}</span>
              </div>
              <div>
                <span className="text-slate-500 dark:text-slate-400 font-medium">Grand Total: </span>
                <span className={`font-extrabold ${accentText}`}>₹{Number(selectedInvoice.grand_total).toFixed(2)}</span>
              </div>
              {selectedInvoice.void_reason && (
                <div>
                  <span className="text-slate-500 dark:text-slate-400 font-medium">Cashier Reason: </span>
                  <span className="font-semibold text-slate-800 dark:text-slate-200 italic">{selectedInvoice.void_reason}</span>
                </div>
              )}
            </div>

            <div>
              <label className="block text-xs font-bold text-slate-700 dark:text-slate-300 mb-1">
                {voidMode === 'REQUEST' ? 'Reason for Cancellation (Required)' : 'Admin Authorization Note'}
              </label>
              <textarea
                value={voidReason}
                onChange={(e) => setVoidReason(e.target.value)}
                placeholder="Specify reason for bill cancellation..."
                className="w-full p-3 border border-slate-200 dark:border-slate-700 bg-white dark:bg-slate-800 rounded-xl text-xs font-medium text-slate-900 dark:text-white"
                rows={3}
                required
              />
            </div>

            <div className="flex space-x-2 pt-2">
              <button
                type="button"
                onClick={() => setShowVoidModal(false)}
                className="w-1/2 py-2.5 bg-slate-100 dark:bg-slate-800 text-slate-700 dark:text-slate-300 font-bold rounded-xl text-xs"
              >
                Cancel
              </button>
              <button
                type="button"
                onClick={submitVoid}
                className="w-1/2 py-2.5 bg-rose-600 hover:bg-rose-700 text-white font-bold rounded-xl text-xs shadow"
              >
                {voidMode === 'REQUEST' ? 'Submit Request' : 'Confirm & VOID Bill'}
              </button>
            </div>
          </div>
        </div>
      )}
    </AuthenticatedLayout>
  );
}

