import InputError from '@/Components/InputError';
import InputLabel from '@/Components/InputLabel';
import PrimaryButton from '@/Components/PrimaryButton';
import TextInput from '@/Components/TextInput';
import AuthenticatedLayout from '@/Layouts/AuthenticatedLayout';
import { PageProps } from '@/types';
import { Paginated } from '@/types/crm';
import { Head, router, useForm } from '@inertiajs/react';
import { FormEventHandler, ReactNode, useState } from 'react';

type UserRow = {
    id: number;
    name: string;
    email: string;
    crm_role: string;
    account_status: string;
    created_at: string;
};

type Props = PageProps<{
    users: Paginated<UserRow>;
    filters: { search: string };
    roleLabels: Record<string, string>;
    statusLabels: Record<string, string>;
    stats: { total: number; active: number; commercials: number; supervisors: number };
    flash?: { success?: string | null };
}>;

export default function UsersIndex({ users, filters, roleLabels, statusLabels, stats, flash }: Props) {
    const [search, setSearch] = useState(filters.search);
    const form = useForm({
        name: '',
        email: '',
        password: '',
        password_confirmation: '',
        crm_role: 'commercial',
        account_status: 'active',
    });
    const submit: FormEventHandler = (event) => {
        event.preventDefault();
        form.post(route('users.store'), { onSuccess: () => form.reset() });
    };

    return (
        <AuthenticatedLayout header={<Title />}>
            <Head title="Utilisateurs" />
            <div className="mx-auto max-w-[1500px] space-y-5 px-4 py-5 sm:px-6 lg:px-7">
                {flash?.success && <div className="rounded-lg border border-emerald-200 bg-emerald-50 px-4 py-3 text-sm font-semibold text-emerald-700">{flash.success}</div>}
                <section className="grid gap-3 sm:grid-cols-2 xl:grid-cols-4">
                    <Metric label="Utilisateurs" value={stats.total} />
                    <Metric label="Actifs" value={stats.active} />
                    <Metric label="Commerciaux" value={stats.commercials} />
                    <Metric label="Encadrement" value={stats.supervisors} />
                </section>
                <div className="grid gap-5 xl:grid-cols-[340px_1fr]">
                    <form onSubmit={submit} className="space-y-4 rounded-xl border border-slate-200 bg-white p-5 shadow-sm">
                        <h2 className="text-sm font-bold uppercase tracking-wide text-[#062853]">Inviter un utilisateur</h2>
                        <Field label="Nom" id="user_name"><TextInput id="user_name" value={form.data.name} onChange={(event) => form.setData('name', event.target.value)} className="mt-1 w-full" /><InputError message={form.errors.name} className="mt-1" /></Field>
                        <Field label="Email" id="user_email"><TextInput id="user_email" type="email" value={form.data.email} onChange={(event) => form.setData('email', event.target.value)} className="mt-1 w-full" /><InputError message={form.errors.email} className="mt-1" /></Field>
                        <div className="grid grid-cols-2 gap-3">
                            <Field label="Rôle" id="user_role">
                                <select id="user_role" value={form.data.crm_role} onChange={(event) => form.setData('crm_role', event.target.value)} className="mt-1 w-full rounded-lg border-slate-200 text-sm">
                                    {Object.entries(roleLabels).map(([value, label]) => <option key={value} value={value}>{label}</option>)}
                                </select>
                            </Field>
                            <Field label="Statut" id="user_status">
                                <select id="user_status" value={form.data.account_status} onChange={(event) => form.setData('account_status', event.target.value)} className="mt-1 w-full rounded-lg border-slate-200 text-sm">
                                    {Object.entries(statusLabels).map(([value, label]) => <option key={value} value={value}>{label}</option>)}
                                </select>
                            </Field>
                        </div>
                        <Field label="Mot de passe provisoire" id="user_password"><TextInput id="user_password" type="password" value={form.data.password} onChange={(event) => form.setData('password', event.target.value)} className="mt-1 w-full" /><InputError message={form.errors.password} className="mt-1" /></Field>
                        <Field label="Confirmer le mot de passe" id="user_password_confirmation"><TextInput id="user_password_confirmation" type="password" value={form.data.password_confirmation} onChange={(event) => form.setData('password_confirmation', event.target.value)} className="mt-1 w-full" /></Field>
                        <PrimaryButton disabled={form.processing}>Inviter l'utilisateur</PrimaryButton>
                    </form>
                    <section className="overflow-hidden rounded-xl border border-slate-200 bg-white shadow-sm">
                        <form onSubmit={(event) => { event.preventDefault(); router.get(route('users.index'), { search }); }} className="flex justify-between gap-3 border-b border-slate-100 p-4">
                            <h2 className="self-center text-sm font-bold uppercase tracking-wide text-[#062853]">Annuaire des accès</h2>
                            <div className="flex gap-2">
                                <TextInput value={search} onChange={(event) => setSearch(event.target.value)} placeholder="Nom ou email..." />
                                <button className="rounded-lg bg-[#12529c] px-4 text-sm font-semibold text-white">Filtrer</button>
                            </div>
                        </form>
                        <table className="min-w-full text-sm">
                            <thead className="bg-slate-50 text-xs uppercase tracking-wide text-slate-500"><tr><th className="px-4 py-3 text-left">Utilisateur</th><th className="px-4 py-3 text-left">Rôle</th><th className="px-4 py-3 text-left">Statut</th><th className="px-4 py-3 text-left">Créé le</th></tr></thead>
                            <tbody className="divide-y divide-slate-100">
                                {users.data.map((user) => (
                                    <tr key={user.id}>
                                        <td className="px-4 py-4"><p className="font-semibold text-slate-900">{user.name}</p><p className="text-xs text-slate-500">{user.email}</p></td>
                                        <td className="px-4 py-4 text-slate-600">{roleLabels[user.crm_role] ?? user.crm_role}</td>
                                        <td className="px-4 py-4"><Badge status={user.account_status} label={statusLabels[user.account_status] ?? user.account_status} /></td>
                                        <td className="px-4 py-4 text-slate-600">{new Date(user.created_at).toLocaleDateString('fr-FR')}</td>
                                    </tr>
                                ))}
                            </tbody>
                        </table>
                    </section>
                </div>
            </div>
        </AuthenticatedLayout>
    );
}

function Title() { return <div><h1 className="text-2xl font-bold text-[#062853]">Utilisateurs</h1><p className="mt-1 text-sm text-slate-500">Gérez les utilisateurs et leurs accès au CRM</p></div>; }
function Metric({ label, value }: { label: string; value: number }) { return <div className="rounded-xl border border-slate-200 bg-white p-5 shadow-sm"><p className="text-xs font-bold uppercase text-slate-500">{label}</p><p className="mt-3 text-2xl font-bold text-[#062853]">{value}</p></div>; }
function Field({ label, id, children }: { label: string; id: string; children: ReactNode }) { return <div><InputLabel htmlFor={id} value={label} />{children}</div>; }
function Badge({ status, label }: { status: string; label: string }) { const color = status === 'active' ? 'bg-emerald-50 text-emerald-700' : status === 'suspended' ? 'bg-rose-50 text-rose-700' : 'bg-amber-50 text-amber-700'; return <span className={`rounded-full px-3 py-1 text-xs font-semibold ${color}`}>{label}</span>; }
