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 Campaign = {
    id: number;
    name: string;
    channel: string;
    status: string;
    audience_count: number;
    contacted_count: number;
    response_count: number;
    opportunity_count: number;
    starts_at: string | null;
    ends_at: string | null;
};

type Props = PageProps<{
    campaigns: Paginated<Campaign>;
    filters: { search: string; status: string };
    statusLabels: Record<string, string>;
    stats: { total: number; active: number; audience: number; contacted: number; responses: number; opportunities: number };
    flash?: { success?: string | null };
}>;

export default function CampaignsIndex({ campaigns, filters, statusLabels, stats, flash }: Props) {
    const [search, setSearch] = useState(filters.search);
    const form = useForm({
        name: '',
        channel: 'email',
        status: 'draft',
        audience_count: '0',
        contacted_count: '0',
        response_count: '0',
        opportunity_count: '0',
        starts_at: '',
        ends_at: '',
        notes: '',
    });
    const responseRate = stats.contacted > 0 ? Math.round((stats.responses / stats.contacted) * 1000) / 10 : 0;

    const submit: FormEventHandler = (event) => {
        event.preventDefault();
        form.post(route('campaigns.store'), { onSuccess: () => form.reset('name', 'notes') });
    };

    return (
        <AuthenticatedLayout header={<Title title="Campagnes" subtitle="Pilotage des campagnes de prospection multicanales" />}>
            <Head title="Campagnes" />
            <div className="mx-auto max-w-[1500px] space-y-5 px-4 py-5 sm:px-6 lg:px-7">
                {flash?.success && <Alert message={flash.success} />}
                <section className="grid gap-3 sm:grid-cols-2 xl:grid-cols-6">
                    <Metric label="Campagnes" value={stats.total} />
                    <Metric label="Actives" value={stats.active} />
                    <Metric label="Contacts ciblés" value={stats.audience} />
                    <Metric label="Contacts joints" value={stats.contacted} />
                    <Metric label="Taux de réponse" value={`${responseRate}%`} />
                    <Metric label="Opportunités" value={stats.opportunities} />
                </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]">Créer une campagne</h2>
                        <Field label="Nom" id="campaign_name">
                            <TextInput id="campaign_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>
                        <div className="grid grid-cols-2 gap-3">
                            <Field label="Canal" id="campaign_channel">
                                <select id="campaign_channel" value={form.data.channel} onChange={(event) => form.setData('channel', event.target.value)} className="mt-1 w-full rounded-lg border-slate-200 text-sm">
                                    <option value="email">Email</option><option value="telephone">Téléphone</option><option value="courrier">Courrier</option><option value="linkedin">LinkedIn</option>
                                </select>
                            </Field>
                            <Field label="Statut" id="campaign_status">
                                <select id="campaign_status" value={form.data.status} onChange={(event) => form.setData('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>
                        <div className="grid grid-cols-2 gap-3">
                            <CountField label="Ciblés" id="campaign_audience" value={form.data.audience_count} setValue={(value) => form.setData('audience_count', value)} />
                            <CountField label="Joints" id="campaign_contacted" value={form.data.contacted_count} setValue={(value) => form.setData('contacted_count', value)} />
                            <CountField label="Réponses" id="campaign_responses" value={form.data.response_count} setValue={(value) => form.setData('response_count', value)} />
                            <CountField label="Opportunités" id="campaign_opportunities" value={form.data.opportunity_count} setValue={(value) => form.setData('opportunity_count', value)} />
                        </div>
                        <PrimaryButton disabled={form.processing}>Enregistrer la campagne</PrimaryButton>
                    </form>
                    <section className="overflow-hidden rounded-xl border border-slate-200 bg-white shadow-sm">
                        <div 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]">Mes campagnes</h2>
                            <form onSubmit={(event) => { event.preventDefault(); router.get(route('campaigns.index'), { search }); }} className="flex gap-2">
                                <TextInput value={search} onChange={(event) => setSearch(event.target.value)} placeholder="Rechercher..." />
                                <button className="rounded-lg bg-[#12529c] px-4 text-sm font-semibold text-white">Filtrer</button>
                            </form>
                        </div>
                        <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">Campagne</th><th className="px-4 py-3 text-left">Canal</th><th className="px-4 py-3 text-left">Ciblés / joints</th><th className="px-4 py-3 text-left">Réponse</th><th className="px-4 py-3 text-left">Statut</th></tr></thead>
                            <tbody className="divide-y divide-slate-100">
                                {campaigns.data.length === 0 && <tr><td colSpan={5} className="p-12 text-center text-slate-500">Aucune campagne enregistrée.</td></tr>}
                                {campaigns.data.map((campaign) => (
                                    <tr key={campaign.id}>
                                        <td className="px-4 py-4 font-semibold text-slate-900">{campaign.name}</td>
                                        <td className="px-4 py-4 capitalize text-slate-600">{campaign.channel}</td>
                                        <td className="px-4 py-4">{campaign.audience_count} / {campaign.contacted_count}</td>
                                        <td className="px-4 py-4 text-emerald-700">{campaign.contacted_count ? Math.round((campaign.response_count / campaign.contacted_count) * 1000) / 10 : 0}%</td>
                                        <td className="px-4 py-4"><Badge label={statusLabels[campaign.status]} status={campaign.status} /></td>
                                    </tr>
                                ))}
                            </tbody>
                        </table>
                    </section>
                </div>
            </div>
        </AuthenticatedLayout>
    );
}

function Title({ title, subtitle }: { title: string; subtitle: string }) { return <div><h1 className="text-2xl font-bold text-[#062853]">{title}</h1><p className="mt-1 text-sm text-slate-500">{subtitle}</p></div>; }
function Alert({ message }: { message: string }) { return <div className="rounded-lg border border-emerald-200 bg-emerald-50 px-4 py-3 text-sm font-semibold text-emerald-700">{message}</div>; }
function Metric({ label, value }: { label: string; value: number | string }) { 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]">{typeof value === 'number' ? new Intl.NumberFormat('fr-FR').format(value) : value}</p></div>; }
function Field({ label, id, children }: { label: string; id: string; children: ReactNode }) { return <div><InputLabel htmlFor={id} value={label} />{children}</div>; }
function CountField({ label, id, value, setValue }: { label: string; id: string; value: string; setValue: (value: string) => void }) { return <Field label={label} id={id}><TextInput id={id} type="number" min="0" value={value} onChange={(event) => setValue(event.target.value)} className="mt-1 w-full" /></Field>; }
function Badge({ label, status }: { label: string; status: string }) { const colors = status === 'active' ? 'bg-emerald-50 text-emerald-700' : status === 'completed' ? 'bg-blue-50 text-blue-700' : 'bg-slate-100 text-slate-600'; return <span className={`rounded-full px-3 py-1 text-xs font-semibold ${colors}`}>{label}</span>; }
