import AuthenticatedLayout from '@/Layouts/AuthenticatedLayout';
import { Head, Link, useForm } from '@inertiajs/react';
import { Users, ArrowLeft, Check, Lock, Mail, User } from 'lucide-react';
import { Button } from '@/Components/ui/button';
import { Input } from '@/Components/ui/input';
import { Label } from '@/Components/ui/label';
import { RadioGroup, RadioGroupItem } from '@/Components/ui/radio-group';
import { FormEvent } from 'react';
import { Switch } from '@/Components/ui/switch';
import { Can } from '@/Components/Permission/Can';

interface Props {
    roles: Record<string, string>; // Name (ID) -> DisplayName map from pluck
}

export default function UserCreate({ roles }: Props) {
    const { data, setData, post, processing, errors } = useForm({
        name: '',
        email: '',
        username: '',
        password: '',
        password_confirmation: '',
        roles: [] as string[], // Role names
        is_active: true,
    });

    const handleSubmit = (e: FormEvent) => {
        e.preventDefault();
        post(route('users.store'));
    };


    return (
        <AuthenticatedLayout
            breadcrumbs={[
                { label: '系統管理', href: '#' },
                { label: '使用者管理', href: route('users.index') },
                { label: '新增使用者', href: route('users.create'), isPage: true },
            ]}
        >
            <Head title="新增使用者" />

            <div className="container mx-auto p-6 max-w-7xl">
                <form onSubmit={handleSubmit} className="space-y-6">
                    {/* Header Area */}
                    <div>
                        <Link href={route('users.index')}>
                            <Button
                                variant="outline"
                                type="button"
                                className="gap-2 button-outlined-primary mb-2"
                            >
                                <ArrowLeft className="h-4 w-4" />
                                返回使用者管理
                            </Button>
                        </Link>

                        <div className="flex items-center justify-between">
                            <div>
                                <h1 className="text-2xl font-bold text-grey-0 flex items-center gap-2">
                                    <Users className="h-6 w-6 text-primary-main" />
                                    新增使用者
                                </h1>
                                <p className="text-gray-500 mt-1">
                                    建立新帳號並設定初始密碼與角色
                                </p>
                            </div>
                            <Button
                                type="submit"
                                className="button-filled-primary"
                                disabled={processing}
                            >
                                <Check className="h-4 w-4 mr-2" />
                                建立帳號
                            </Button>
                        </div>
                    </div>

                    <div className="space-y-6">
                        {/* Basic Info */}
                        <div className="bg-white p-6 rounded-xl border border-gray-200 shadow-sm space-y-6">
                            <h3 className="font-bold text-gray-900 border-b pb-2 mb-4">基本資料</h3>

                            <div className="grid grid-cols-1 md:grid-cols-2 gap-6">
                                <div className="space-y-2">
                                    <Label htmlFor="username" className="flex items-center gap-2">
                                        <User className="h-4 w-4" /> 使用者名稱 (登入用)
                                    </Label>
                                    <Input
                                        id="username"
                                        value={data.username}
                                        onChange={e => setData('username', e.target.value)}
                                        placeholder="請輸入登入帳號"
                                    />
                                    {errors.username && <p className="text-sm text-red-500">{errors.username}</p>}
                                </div>

                                <div className="space-y-2">
                                    <Label htmlFor="name" className="flex items-center gap-2">
                                        <User className="h-4 w-4" /> 姓名
                                    </Label>
                                    <Input
                                        id="name"
                                        value={data.name}
                                        onChange={e => setData('name', e.target.value)}
                                        placeholder="例如：王小明"
                                    />
                                    {errors.name && <p className="text-sm text-red-500">{errors.name}</p>}
                                </div>
                            </div>

                            <div className="space-y-2">
                                <Label htmlFor="email" className="flex items-center gap-2">
                                    <Mail className="h-4 w-4" /> 電子郵件 (選填)
                                </Label>
                                <Input
                                    id="email"
                                    type="email"
                                    value={data.email}
                                    onChange={e => setData('email', e.target.value)}
                                    placeholder="user@example.com (可省略)"
                                />
                                {errors.email && <p className="text-sm text-red-500">{errors.email}</p>}
                            </div>

                            {/* Status */}
                            <Can permission="users.activate">
                                <div className="space-y-2">
                                    <Label htmlFor="is_active" className="flex items-center gap-2">
                                        <Check className="h-4 w-4" /> 帳號狀態
                                    </Label>
                                    <div className="flex items-center gap-2">
                                        <Switch
                                            id="is_active"
                                            checked={data.is_active}
                                            onCheckedChange={(checked: boolean) => setData('is_active', checked)}
                                        />
                                        <span className="text-sm text-gray-500">
                                            {data.is_active ? '啟用' : '停用'}
                                        </span>
                                    </div>
                                </div>
                            </Can>
                        </div>

                        {/* Roles */}
                        <div className="bg-white p-6 rounded-xl border border-gray-200 shadow-sm">
                            <h3 className="font-bold text-gray-900 border-b pb-2 mb-4">角色分配 (單選)</h3>
                            <RadioGroup
                                value={data.roles[0] || ''}
                                onValueChange={(value) => setData('roles', [value])}
                                className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4"
                            >
                                {Object.entries(roles).map(([roleName, displayName]) => (
                                    <Label
                                        key={roleName}
                                        htmlFor={`role-${roleName}`}
                                        className={`flex items-center space-x-3 p-3 border rounded-lg transition-colors cursor-pointer ${data.roles.includes(roleName)
                                            ? 'border-primary-main bg-primary-lightest'
                                            : 'border-gray-100 bg-gray-50/50 hover:bg-gray-100'
                                            }`}
                                    >
                                        <RadioGroupItem
                                            value={roleName}
                                            id={`role-${roleName}`}
                                            className="text-primary-main border-gray-300"
                                        />
                                        <div className="grid gap-1 leading-none">
                                            <span className="text-sm font-medium leading-none">
                                                {displayName}
                                            </span>
                                            <span className="text-xs text-gray-500 font-mono">
                                                {roleName}
                                            </span>
                                        </div>
                                    </Label>
                                ))}
                            </RadioGroup>
                            {errors.roles && <p className="text-sm text-red-500 mt-2">{errors.roles}</p>}
                        </div>

                        {/* Password */}
                        <div className="bg-white p-6 rounded-xl border border-gray-200 shadow-sm space-y-6">
                            <h3 className="font-bold text-gray-900 border-b pb-2 mb-4">安全設定</h3>

                            <div className="grid grid-cols-1 md:grid-cols-2 gap-6">
                                <div className="space-y-2">
                                    <Label htmlFor="password" className="flex items-center gap-2">
                                        <Lock className="h-4 w-4" /> 設定密碼
                                    </Label>
                                    <Input
                                        id="password"
                                        type="password"
                                        value={data.password}
                                        onChange={e => setData('password', e.target.value)}
                                    />
                                    {errors.password && <p className="text-sm text-red-500">{errors.password}</p>}
                                </div>

                                <div className="space-y-2">
                                    <Label htmlFor="password_confirmation" className="flex items-center gap-2">
                                        <Lock className="h-4 w-4" /> 確認密碼
                                    </Label>
                                    <Input
                                        id="password_confirmation"
                                        type="password"
                                        value={data.password_confirmation}
                                        onChange={e => setData('password_confirmation', e.target.value)}
                                    />
                                </div>
                            </div>
                        </div>
                    </div>
                </form>
            </div>
        </AuthenticatedLayout>
    );
}
