import { Head, Link, useForm, usePage } from '@inertiajs/react';
import { Button } from '@/components/ui/button';
import {
    Card,
    CardContent,
    CardDescription,
    CardHeader,
    CardTitle,
} from '@/components/ui/card';
import { Input } from '@/components/ui/input';
import { Label } from '@/components/ui/label';
import {
    Select,
    SelectContent,
    SelectItem,
    SelectTrigger,
    SelectValue,
} from '@/components/ui/select';
import InputError from '@/components/input-error';
import type { Category, Company, System } from '@/types';

type Props = {
    companies: Company[];
    systems: System[];
    categories: Category[];
};

export default function SubmitTicket({
    companies,
    systems,
    categories,
}: Props) {
    const { data, setData, post, processing, errors } = useForm({
        company_id: '',
        system_id: '',
        category_id: '',
        title: '',
        description: '',
        priority: 'medium',
        metadata: {} as Record<string, string>,
        submitter_name: '',
        submitter_email: '',
    });

    const filteredCategories = categories.filter(
        (c) => !data.system_id || c.system_id === Number(data.system_id),
    );

    const selectedSystem = systems.find((s) => s.id === Number(data.system_id));

    function handleSubmit(e: React.FormEvent) {
        e.preventDefault();
        post('/submit');
    }

    return (
        <>
            <Head title="Submit a Ticket" />
            <div className="min-h-screen bg-gray-50 dark:bg-gray-950">
                <header className="border-b bg-white dark:bg-gray-900">
                    <div className="mx-auto flex max-w-4xl items-center justify-between px-4 py-4">
                        <Link href="/" className="text-xl font-bold">
                            Support Center
                        </Link>
                        <div className="flex gap-3">
                            <Button variant="outline" size="sm" asChild>
                                <Link href="/ticket-status">Track Ticket</Link>
                            </Button>
                            <Button variant="ghost" size="sm" asChild>
                                <Link href="/login">Staff Login</Link>
                            </Button>
                        </div>
                    </div>
                </header>

                <main className="mx-auto max-w-2xl space-y-6 px-4 py-8">
                    <div>
                        <h1 className="text-3xl font-bold">
                            Submit a Support Ticket
                        </h1>
                        <p className="mt-1 text-muted-foreground">
                            Fill out the form below and our team will get back
                            to you as soon as possible.
                        </p>
                    </div>

                    <form onSubmit={handleSubmit} className="space-y-6">
                        {/* Contact Info */}
                        <Card>
                            <CardHeader>
                                <CardTitle>Your Information</CardTitle>
                                <CardDescription>
                                    How can we reach you?
                                </CardDescription>
                            </CardHeader>
                            <CardContent className="space-y-4">
                                <div className="grid grid-cols-2 gap-4">
                                    <div className="space-y-2">
                                        <Label htmlFor="submitter_name">
                                            Full Name
                                        </Label>
                                        <Input
                                            id="submitter_name"
                                            value={data.submitter_name}
                                            onChange={(e) =>
                                                setData(
                                                    'submitter_name',
                                                    e.target.value,
                                                )
                                            }
                                            placeholder="John Doe"
                                        />
                                        <InputError
                                            message={errors.submitter_name}
                                        />
                                    </div>
                                    <div className="space-y-2">
                                        <Label htmlFor="submitter_email">
                                            Email Address
                                        </Label>
                                        <Input
                                            id="submitter_email"
                                            type="email"
                                            value={data.submitter_email}
                                            onChange={(e) =>
                                                setData(
                                                    'submitter_email',
                                                    e.target.value,
                                                )
                                            }
                                            placeholder="john@example.com"
                                        />
                                        <InputError
                                            message={errors.submitter_email}
                                        />
                                    </div>
                                </div>
                            </CardContent>
                        </Card>

                        {/* Ticket Details */}
                        <Card>
                            <CardHeader>
                                <CardTitle>Ticket Details</CardTitle>
                                <CardDescription>
                                    Tell us about the issue
                                </CardDescription>
                            </CardHeader>
                            <CardContent className="space-y-4">
                                <div className="grid grid-cols-2 gap-4">
                                    <div className="space-y-2">
                                        <Label>Company</Label>
                                        <Select
                                            value={data.company_id}
                                            onValueChange={(v) =>
                                                setData('company_id', v)
                                            }
                                        >
                                            <SelectTrigger>
                                                <SelectValue placeholder="Select your company" />
                                            </SelectTrigger>
                                            <SelectContent>
                                                {companies.map((c) => (
                                                    <SelectItem
                                                        key={c.id}
                                                        value={String(c.id)}
                                                    >
                                                        {c.name}
                                                    </SelectItem>
                                                ))}
                                            </SelectContent>
                                        </Select>
                                        <InputError
                                            message={errors.company_id}
                                        />
                                    </div>

                                    <div className="space-y-2">
                                        <Label>System</Label>
                                        <Select
                                            value={data.system_id}
                                            onValueChange={(v) => {
                                                setData('system_id', v);
                                                setData('category_id', '');
                                            }}
                                        >
                                            <SelectTrigger>
                                                <SelectValue placeholder="Select system" />
                                            </SelectTrigger>
                                            <SelectContent>
                                                {systems.map((s) => (
                                                    <SelectItem
                                                        key={s.id}
                                                        value={String(s.id)}
                                                    >
                                                        {s.name}
                                                    </SelectItem>
                                                ))}
                                            </SelectContent>
                                        </Select>
                                        <InputError
                                            message={errors.system_id}
                                        />
                                    </div>
                                </div>

                                <div className="grid grid-cols-2 gap-4">
                                    <div className="space-y-2">
                                        <Label>Category</Label>
                                        <Select
                                            value={data.category_id}
                                            onValueChange={(v) =>
                                                setData('category_id', v)
                                            }
                                        >
                                            <SelectTrigger>
                                                <SelectValue placeholder="Select category" />
                                            </SelectTrigger>
                                            <SelectContent>
                                                {filteredCategories.map((c) => (
                                                    <SelectItem
                                                        key={c.id}
                                                        value={String(c.id)}
                                                    >
                                                        {c.name}
                                                    </SelectItem>
                                                ))}
                                            </SelectContent>
                                        </Select>
                                        <InputError
                                            message={errors.category_id}
                                        />
                                    </div>

                                    <div className="space-y-2">
                                        <Label>Priority</Label>
                                        <Select
                                            value={data.priority}
                                            onValueChange={(v) =>
                                                setData('priority', v)
                                            }
                                        >
                                            <SelectTrigger>
                                                <SelectValue />
                                            </SelectTrigger>
                                            <SelectContent>
                                                <SelectItem value="low">
                                                    Low
                                                </SelectItem>
                                                <SelectItem value="medium">
                                                    Medium
                                                </SelectItem>
                                                <SelectItem value="high">
                                                    High
                                                </SelectItem>
                                                <SelectItem value="critical">
                                                    Critical
                                                </SelectItem>
                                            </SelectContent>
                                        </Select>
                                    </div>
                                </div>

                                <div className="space-y-2">
                                    <Label htmlFor="title">Subject</Label>
                                    <Input
                                        id="title"
                                        value={data.title}
                                        onChange={(e) =>
                                            setData('title', e.target.value)
                                        }
                                        placeholder="Brief description of the issue"
                                    />
                                    <InputError message={errors.title} />
                                </div>

                                <div className="space-y-2">
                                    <Label htmlFor="description">
                                        Description
                                    </Label>
                                    <textarea
                                        id="description"
                                        value={data.description}
                                        onChange={(e) =>
                                            setData(
                                                'description',
                                                e.target.value,
                                            )
                                        }
                                        placeholder="Please describe your issue in detail..."
                                        rows={6}
                                        className="flex min-h-[80px] w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:outline-none"
                                    />
                                    <InputError message={errors.description} />
                                </div>

                                {/* Dynamic fields */}
                                {selectedSystem?.code === 'POLICY' && (
                                    <div className="space-y-2">
                                        <Label>Policy Number (optional)</Label>
                                        <Input
                                            value={
                                                (data.metadata as any)
                                                    .policy_no ?? ''
                                            }
                                            onChange={(e) =>
                                                setData('metadata', {
                                                    ...data.metadata,
                                                    policy_no: e.target.value,
                                                })
                                            }
                                            placeholder="e.g. POL-2024-001234"
                                        />
                                    </div>
                                )}
                                {selectedSystem?.code === 'CLAIMS' && (
                                    <div className="space-y-2">
                                        <Label>Claim Number (optional)</Label>
                                        <Input
                                            value={
                                                (data.metadata as any)
                                                    .claim_no ?? ''
                                            }
                                            onChange={(e) =>
                                                setData('metadata', {
                                                    ...data.metadata,
                                                    claim_no: e.target.value,
                                                })
                                            }
                                            placeholder="e.g. CLM-2024-005678"
                                        />
                                    </div>
                                )}
                            </CardContent>
                        </Card>

                        <div className="flex gap-3">
                            <Button
                                type="submit"
                                disabled={processing}
                                size="lg"
                            >
                                {processing ? 'Submitting...' : 'Submit Ticket'}
                            </Button>
                        </div>
                    </form>
                </main>

                <footer className="border-t bg-white py-6 text-center text-sm text-muted-foreground dark:bg-gray-900">
                    Need to check an existing ticket?{' '}
                    <Link
                        href="/ticket-status"
                        className="text-primary underline"
                    >
                        Track your ticket here
                    </Link>
                </footer>
            </div>
        </>
    );
}
