import React, { useState, useEffect } from 'react';
import { Head, Link, router, useForm } from '@inertiajs/react';
import AuthenticatedLayout from '@/Layouts/AuthenticatedLayout';
import { Customer } from '@/types';
import { Users, Search, Phone, Eye, X } from '@/Components/AnimatedIcons';

interface Props {
  customers: {
    data: Customer[];
  };
  filters: {
    search?: string;
  };
}

export default function CustomersIndex({ customers, filters }: Props) {
  const [search, setSearch] = useState(filters.search || '');
  const [accentColor, setAccentColor] = useState<string>(() => localStorage.getItem('admin_accent_color') || 'pink');
  const [showEditModal, setShowEditModal] = useState(false);
  const [editingCustomer, setEditingCustomer] = useState<Customer | null>(null);
  
  const { data, setData, put, processing, errors, reset } = useForm({
    name: '',
    mobile: '',
    email: '',
    address: '',
    date_of_birth: '',
    anniversary_date: '',
  });

  useEffect(() => {
    const handleAccentChange = (e: CustomEvent) => setAccentColor(e.detail);
    window.addEventListener('theme_accent_changed', handleAccentChange as EventListener);
    return () => window.removeEventListener('theme_accent_changed', handleAccentChange as EventListener);
  }, []);

  const accentBg = accentColor === 'seagreen' ? 'bg-[#0CA996] hover:bg-[#098878]' : 'bg-[#FF0D8F] hover:bg-[#d90978]';
  const accentText = accentColor === 'seagreen' ? 'text-[#0CA996]' : 'text-[#FF0D8F]';

  const handleSearch = (e: React.FormEvent) => {
    e.preventDefault();
    router.get(route('admin.customers.index'), { search }, { preserveState: true });
  };

  const openEditModal = (customer: Customer) => {
    setEditingCustomer(customer);
    setData({
      name: customer.name || '',
      mobile: customer.mobile || '',
      email: customer.email || '',
      address: customer.address || '',
      date_of_birth: customer.date_of_birth || '',
      anniversary_date: customer.anniversary_date || '',
    });
    setShowEditModal(true);
  };

  const handleEditSubmit = (e: React.FormEvent) => {
    e.preventDefault();
    if (!editingCustomer) return;

    put(route('admin.customers.update', editingCustomer.id), {
      onSuccess: () => {
        setShowEditModal(false);
        setEditingCustomer(null);
        reset();
      },
    });
  };

  return (
    <AuthenticatedLayout>
      <Head title="Customer Management - Cakes & Candles" />

      <div className="space-y-6">
        <div>
          <h1 className="text-2xl font-bold text-slate-900 dark:text-white flex items-center space-x-2.5">
            <Users className={`w-7 h-7 ${accentText}`} />
            <span>Customer CRM & Purchase History</span>
          </h1>
          <p className="text-xs text-slate-500 dark:text-slate-400 font-medium mt-1">
            Centralized customer directory, mobile lookup, birthdays & celebratory order history
          </p>
        </div>

        {/* Search Bar */}
        <form onSubmit={handleSearch} className="bg-white dark:bg-slate-900 p-4 rounded-2xl border border-slate-200 dark:border-slate-800 shadow-sm flex gap-3">
          <div className="relative flex-1">
            <Search className="w-4 h-4 absolute left-3.5 top-3 text-slate-400 dark:text-slate-500" />
            <input
              type="text"
              value={search}
              onChange={(e) => setSearch(e.target.value)}
              placeholder="Search by customer mobile number, name, or email..."
              className="w-full pl-10 pr-3 py-2 border border-slate-200 dark:border-slate-800 dark:bg-slate-950 rounded-xl text-xs font-medium text-slate-900 dark:text-white focus:outline-none"
            />
          </div>
          <button type="submit" className={`px-5 py-2 ${accentBg} text-white font-semibold text-xs rounded-xl shadow-sm transition-all`}>
            Search
          </button>
        </form>

        {/* Customers Table */}
        <div className="bg-white dark:bg-slate-900 rounded-2xl border border-slate-200 dark:border-slate-800 shadow-sm overflow-hidden">
          <div className="overflow-x-auto">
            <table className="w-full text-left text-xs">
              <thead className="bg-slate-50 dark:bg-slate-950 text-slate-500 dark:text-slate-400 uppercase font-semibold text-[11px] tracking-wider border-b border-slate-200 dark:border-slate-800">
                <tr>
                  <th className="p-4">Customer Name</th>
                  <th className="p-4">Mobile Number</th>
                  <th className="p-4">Email / Address</th>
                  <th className="p-4">Birth & Anniversary</th>
                  <th className="p-4 text-center">Total Invoices</th>
                  <th className="p-4 text-center">History</th>
                </tr>
              </thead>
              <tbody className="divide-y divide-slate-100 dark:divide-slate-800/60 font-medium">
                {customers.data.map((c) => (
                  <tr key={c.id} className="hover:bg-slate-50/70 dark:hover:bg-slate-800/40 transition-colors">
                    <td className="p-4 font-bold text-slate-900 dark:text-white">{c.name}</td>
                    <td className="p-4 font-bold text-slate-900 dark:text-white flex items-center space-x-1.5">
                      <Phone className="w-3.5 h-3.5 text-slate-400 dark:text-slate-500" />
                      <span className="">{c.mobile}</span>
                    </td>
                    <td className="p-4 text-slate-600 dark:text-slate-400">
                      <div className="font-semibold text-slate-800 dark:text-slate-200">{c.email || 'No email registered'}</div>
                      <div className="text-[11px] text-slate-400 dark:text-slate-500 mt-0.5">{c.address || 'No address details'}</div>
                    </td>
                    <td className="p-4 text-slate-600 dark:text-slate-400 font-semibold">
                      {c.date_of_birth && <div>DOB: {c.date_of_birth}</div>}
                      {c.anniversary_date && <div>Anniversary: {c.anniversary_date}</div>}
                      {!c.date_of_birth && !c.anniversary_date && <span className="text-slate-400 dark:text-slate-500 italic font-normal">None recorded</span>}
                    </td>
                    <td className="p-4 text-center font-bold text-slate-900 dark:text-white">
                      {c.invoices_count || 0} Bills
                    </td>
                    <td className="p-4 text-center">
                      <Link
                        href={route('admin.customers.show', c.id)}
                        className="px-3 py-1.5 bg-slate-100 dark:bg-slate-800 hover:bg-slate-200 dark:hover:bg-slate-700 text-slate-700 dark:text-slate-300 rounded-xl text-xs font-semibold inline-flex items-center space-x-1.5 border border-slate-200 dark:border-slate-700 transition-colors"
                      >
                        <Eye className="w-3.5 h-3.5" />
                        <span>View Orders</span>
                      </Link>
                      
                      <button
                        onClick={() => openEditModal(c)}
                        className="ml-2 px-3 py-1.5 bg-blue-500/10 text-blue-600 dark:text-blue-400 hover:bg-blue-500/20 border border-blue-500/20 rounded-xl text-xs font-semibold transition-colors"
                      >
                        Edit
                      </button>
                    </td>
                  </tr>
                ))}
              </tbody>
            </table>
          </div>
        </div>
      </div>

      {/* EDIT CUSTOMER MODAL */}
      {showEditModal && (
        <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 rounded-2xl max-w-lg w-full p-6 space-y-5 shadow-2xl border border-slate-200 dark:border-slate-800">
            <div className="flex justify-between items-center border-b border-slate-200 dark:border-slate-800 pb-3">
              <h3 className="font-bold text-base text-slate-900 dark:text-white">Edit Customer Details</h3>
              <button 
                onClick={() => { setShowEditModal(false); reset(); setEditingCustomer(null); }}
                className="text-slate-400 hover:text-slate-600 dark:hover:text-slate-200"
              >
                <X className="w-5 h-5" />
              </button>
            </div>

            <form onSubmit={handleEditSubmit} className="space-y-4 text-xs font-medium">
              <div className="grid grid-cols-2 gap-4">
                <div>
                  <label className="block text-slate-700 dark:text-slate-300 font-semibold mb-1">Name *</label>
                  <input
                    type="text"
                    required
                    value={data.name}
                    onChange={e => setData('name', e.target.value)}
                    className="w-full rounded-xl border border-slate-200 dark:border-slate-800 dark:bg-slate-950 p-2.5 text-xs font-semibold text-slate-900 dark:text-white focus:outline-none"
                  />
                  {errors.name && <span className="text-rose-600 text-[10px]">{errors.name}</span>}
                </div>
                
                <div>
                  <label className="block text-slate-700 dark:text-slate-300 font-semibold mb-1">Mobile *</label>
                  <input
                    type="text"
                    required
                    value={data.mobile}
                    onChange={e => setData('mobile', e.target.value)}
                    className="w-full rounded-xl border border-slate-200 dark:border-slate-800 dark:bg-slate-950 p-2.5 text-xs font-semibold text-slate-900 dark:text-white focus:outline-none"
                  />
                  {errors.mobile && <span className="text-rose-600 text-[10px]">{errors.mobile}</span>}
                </div>
              </div>

              <div>
                <label className="block text-slate-700 dark:text-slate-300 font-semibold mb-1">Email</label>
                <input
                  type="email"
                  value={data.email}
                  onChange={e => setData('email', e.target.value)}
                  className="w-full rounded-xl border border-slate-200 dark:border-slate-800 dark:bg-slate-950 p-2.5 text-xs font-semibold text-slate-900 dark:text-white focus:outline-none"
                />
                {errors.email && <span className="text-rose-600 text-[10px]">{errors.email}</span>}
              </div>

              <div>
                <label className="block text-slate-700 dark:text-slate-300 font-semibold mb-1">Address</label>
                <textarea
                  value={data.address}
                  onChange={e => setData('address', e.target.value)}
                  rows={2}
                  className="w-full rounded-xl border border-slate-200 dark:border-slate-800 dark:bg-slate-950 p-2.5 text-xs font-semibold text-slate-900 dark:text-white focus:outline-none"
                />
              </div>

              <div className="grid grid-cols-2 gap-4">
                <div>
                  <label className="block text-slate-700 dark:text-slate-300 font-semibold mb-1">Date of Birth</label>
                  <input
                    type="date"
                    value={data.date_of_birth}
                    onChange={e => setData('date_of_birth', e.target.value)}
                    className="w-full rounded-xl border border-slate-200 dark:border-slate-800 dark:bg-slate-950 p-2.5 text-xs font-semibold text-slate-900 dark:text-white focus:outline-none"
                  />
                </div>
                
                <div>
                  <label className="block text-slate-700 dark:text-slate-300 font-semibold mb-1">Anniversary</label>
                  <input
                    type="date"
                    value={data.anniversary_date}
                    onChange={e => setData('anniversary_date', e.target.value)}
                    className="w-full rounded-xl border border-slate-200 dark:border-slate-800 dark:bg-slate-950 p-2.5 text-xs font-semibold text-slate-900 dark:text-white focus:outline-none"
                  />
                </div>
              </div>

              <div className="pt-3 border-t border-slate-200 dark:border-slate-800 flex justify-end space-x-3">
                <button
                  type="button"
                  onClick={() => { setShowEditModal(false); reset(); setEditingCustomer(null); }}
                  className="px-4 py-2.5 bg-slate-100 dark:bg-slate-800 hover:bg-slate-200 dark:hover:bg-slate-700 rounded-xl text-slate-700 dark:text-slate-300 font-semibold transition-colors"
                >
                  Cancel
                </button>
                <button
                  type="submit"
                  disabled={processing}
                  className={`px-5 py-2.5 ${accentBg} text-white font-semibold rounded-xl shadow-md transition-all`}
                >
                  Save Changes
                </button>
              </div>
            </form>
          </div>
        </div>
      )}
    </AuthenticatedLayout>
  );
}

