import { FormEvent, useState } from "react";
import { Head, Link, useForm } from "@inertiajs/react";
import {
    ArrowRight,
    Building2,
    CheckCircle2,
    Eye,
    EyeOff,
    Mail,
    MapPin,
    Phone,
    ShieldCheck,
    UserRound,
} from "lucide-react";
import { Button } from "@/components/ui/button";
import { Input } from "@/components/ui/input";
import { Label } from "@/components/ui/label";
import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs";
import InputError from "@/components/input-error";

export default function RegisterCompany() {
    const [showPassword, setShowPassword] = useState(false);
    const [activeTab, setActiveTab] = useState("company");

    const { data, setData, post, processing, errors } = useForm({
        company_name: "",
        company_email: "",
        company_phone: "",
        company_address: "",
        name: "",
        email: "",
        password: "",
        password_confirmation: "",
    });

    const submit = (event: FormEvent) => {
        event.preventDefault();
        post("/register-company");
    };

    const inputClass =
        "h-11 rounded-xl border-slate-200 bg-slate-50/60 pl-10 shadow-none transition focus-visible:bg-white focus-visible:ring-2 focus-visible:ring-blue-500/20 dark:border-slate-700 dark:bg-slate-800/60";

    return (
        <>
            <Head title="Daftar Perusahaan" />

            <form onSubmit={submit} className="space-y-4">
                <div className="rounded-2xl border border-slate-200 bg-white p-3 shadow-sm dark:border-slate-800 dark:bg-slate-900 sm:p-4">
                    <Tabs
                        value={activeTab}
                        onValueChange={setActiveTab}
                        className="w-full"
                    >
                        <TabsList className="grid w-full grid-cols-2 rounded-xl bg-slate-100 p-1 dark:bg-slate-800">
                            <TabsTrigger
                                value="company"
                                className="rounded-lg gap-2 text-xs font-semibold data-[state=active]:bg-white data-[state=active]:text-[#1769e0] data-[state=active]:shadow-sm dark:data-[state=active]:bg-slate-900"
                            >
                                <Building2 className="size-4" />
                                <span>Perusahaan</span>
                            </TabsTrigger>
                            <TabsTrigger
                                value="administrator"
                                className="rounded-lg gap-2 text-xs font-semibold data-[state=active]:bg-white data-[state=active]:text-[#1769e0] data-[state=active]:shadow-sm dark:data-[state=active]:bg-slate-900"
                            >
                                <UserRound className="size-4" />
                                <span>Administrator</span>
                            </TabsTrigger>
                        </TabsList>

                        <TabsContent value="company" className="mt-4">
                            <section className="rounded-xl border border-slate-200 bg-slate-50/50 p-4 dark:border-slate-800 dark:bg-slate-800/30 sm:p-5">
                                <SectionHeading
                                    icon={Building2}
                                    eyebrow="Langkah 1"
                                    title="Data perusahaan"
                                    description="Identitas utama workspace perusahaan Anda."
                                />

                                <div className="mt-5 grid gap-4 sm:grid-cols-2">
                                    <Field
                                        label="Nama perusahaan *"
                                        error={errors.company_name}
                                        icon={Building2}
                                    >
                                        <Input
                                            value={data.company_name}
                                            onChange={(e) =>
                                                setData(
                                                    "company_name",
                                                    e.target.value,
                                                )
                                            }
                                            required
                                            autoFocus
                                            placeholder="PT Nama Perusahaan"
                                            className={inputClass}
                                        />
                                    </Field>

                                    <Field
                                        label="Email perusahaan"
                                        error={errors.company_email}
                                        icon={Mail}
                                    >
                                        <Input
                                            type="email"
                                            value={data.company_email}
                                            onChange={(e) =>
                                                setData(
                                                    "company_email",
                                                    e.target.value,
                                                )
                                            }
                                            placeholder="info@perusahaan.com"
                                            className={inputClass}
                                        />
                                    </Field>

                                    <Field
                                        label="Nomor telepon"
                                        error={errors.company_phone}
                                        icon={Phone}
                                    >
                                        <Input
                                            value={data.company_phone}
                                            onChange={(e) =>
                                                setData(
                                                    "company_phone",
                                                    e.target.value,
                                                )
                                            }
                                            placeholder="08xxxxxxxxxx"
                                            className={inputClass}
                                        />
                                    </Field>

                                    <Field
                                        label="Alamat perusahaan"
                                        error={errors.company_address}
                                        icon={MapPin}
                                    >
                                        <Input
                                            value={data.company_address}
                                            onChange={(e) =>
                                                setData(
                                                    "company_address",
                                                    e.target.value,
                                                )
                                            }
                                            placeholder="Alamat lengkap perusahaan"
                                            className={inputClass}
                                        />
                                    </Field>
                                </div>

                                <div className="mt-5 flex items-center justify-end border-t border-slate-200 pt-4 dark:border-slate-700">
                                    <button
                                        type="button"
                                        onClick={() =>
                                            setActiveTab("administrator")
                                        }
                                        className="inline-flex h-10 items-center gap-2 rounded-xl bg-[#1769e0] px-4 text-sm font-semibold text-white shadow-sm transition hover:bg-[#1258bd]"
                                    >
                                        Lanjut ke administrator
                                        <ArrowRight className="size-4" />
                                    </button>
                                </div>
                            </section>
                        </TabsContent>

                        <TabsContent value="administrator" className="mt-4">
                            <section className="rounded-xl border border-slate-200 bg-slate-50/50 p-4 dark:border-slate-800 dark:bg-slate-800/30 sm:p-5">
                                <SectionHeading
                                    icon={UserRound}
                                    eyebrow="Langkah 2"
                                    title="Administrator"
                                    description="Buat akun pengguna pertama untuk workspace Anda."
                                />

                                <div className="mt-5 grid gap-4 sm:grid-cols-2">
                                    <Field
                                        label="Nama administrator *"
                                        error={errors.name}
                                        icon={UserRound}
                                    >
                                        <Input
                                            value={data.name}
                                            onChange={(e) =>
                                                setData("name", e.target.value)
                                            }
                                            required
                                            autoComplete="name"
                                            placeholder="Nama lengkap"
                                            className={inputClass}
                                        />
                                    </Field>

                                    <Field
                                        label="Email administrator *"
                                        error={errors.email}
                                        icon={Mail}
                                    >
                                        <Input
                                            type="email"
                                            value={data.email}
                                            onChange={(e) =>
                                                setData("email", e.target.value)
                                            }
                                            required
                                            autoComplete="email"
                                            placeholder="admin@perusahaan.com"
                                            className={inputClass}
                                        />
                                    </Field>

                                    <Field
                                        label="Password *"
                                        error={errors.password}
                                        icon={ShieldCheck}
                                    >
                                        <div className="relative">
                                            <Input
                                                type={
                                                    showPassword
                                                        ? "text"
                                                        : "password"
                                                }
                                                value={data.password}
                                                onChange={(e) =>
                                                    setData(
                                                        "password",
                                                        e.target.value,
                                                    )
                                                }
                                                required
                                                autoComplete="new-password"
                                                placeholder="Buat password"
                                                className={`${inputClass} pr-10`}
                                            />
                                            <button
                                                type="button"
                                                onClick={() =>
                                                    setShowPassword(
                                                        (value) => !value,
                                                    )
                                                }
                                                className="absolute right-3 top-1/2 -translate-y-1/2 text-slate-400 transition hover:text-slate-700 dark:hover:text-slate-200"
                                                aria-label={
                                                    showPassword
                                                        ? "Sembunyikan password"
                                                        : "Tampilkan password"
                                                }
                                            >
                                                {showPassword ? (
                                                    <EyeOff className="size-4" />
                                                ) : (
                                                    <Eye className="size-4" />
                                                )}
                                            </button>
                                        </div>
                                    </Field>

                                    <Field
                                        label="Konfirmasi password *"
                                        error={errors.password_confirmation}
                                        icon={ShieldCheck}
                                    >
                                        <Input
                                            type={
                                                showPassword
                                                    ? "text"
                                                    : "password"
                                            }
                                            value={data.password_confirmation}
                                            onChange={(e) =>
                                                setData(
                                                    "password_confirmation",
                                                    e.target.value,
                                                )
                                            }
                                            required
                                            autoComplete="new-password"
                                            placeholder="Ulangi password"
                                            className={inputClass}
                                        />
                                    </Field>
                                </div>

                                <div className="mt-5 flex items-center justify-between border-t border-slate-200 pt-4 dark:border-slate-700">
                                    <button
                                        type="button"
                                        onClick={() => setActiveTab("company")}
                                        className="inline-flex h-10 items-center gap-2 rounded-xl border border-slate-200 bg-white px-4 text-sm font-semibold text-slate-700 transition hover:border-blue-200 hover:bg-blue-50/50 hover:text-blue-700 dark:border-slate-700 dark:bg-slate-900 dark:text-slate-200"
                                    >
                                        Kembali
                                    </button>
                                    <span className="hidden text-xs text-slate-400 sm:block">
                                        Data sudah lengkap? Buat workspace di
                                        bawah.
                                    </span>
                                </div>
                            </section>
                        </TabsContent>
                    </Tabs>
                </div>

                <div className="flex items-start gap-2.5 rounded-xl border border-blue-100 bg-blue-50/70 px-3.5 py-2.5 text-xs text-blue-800">
                    <ShieldCheck className="mt-0.5 size-4 shrink-0 text-blue-600" />
                    <div>
                        <p className="font-semibold">Workspace trial 14 hari</p>
                        <p className="mt-0.5 leading-4 text-blue-800/70">
                            Administrator dapat langsung masuk setelah
                            pendaftaran berhasil.
                        </p>
                    </div>
                </div>

                <Button
                    type="submit"
                    className="h-11 w-full rounded-xl bg-[#1769e0] font-semibold shadow-lg shadow-blue-500/20 transition-all hover:-translate-y-0.5 hover:bg-[#1258bd] hover:shadow-xl hover:shadow-blue-500/20"
                    disabled={processing}
                >
                    {processing ? "Membuat workspace..." : "Buat workspace"}
                    {!processing && <ArrowRight className="size-4" />}
                </Button>

                <div className="relative py-0.5">
                    <div className="absolute inset-0 flex items-center">
                        <span className="w-full border-t border-slate-200 dark:border-slate-800" />
                    </div>
                    <div className="relative flex justify-center">
                        <span className="bg-white px-3 text-[10px] font-medium tracking-wide text-slate-400 dark:bg-slate-900">
                            SUDAH PUNYA AKUN?
                        </span>
                    </div>
                </div>

                <Link
                    href="/login"
                    className="flex h-10 w-full items-center justify-center rounded-xl border border-slate-200 bg-white text-sm font-semibold text-slate-700 transition hover:border-blue-200 hover:bg-blue-50/50 hover:text-blue-700 dark:border-slate-700 dark:bg-slate-900 dark:text-slate-200"
                >
                    Masuk ke akun
                </Link>

                <div className="flex items-center justify-center gap-2 pt-0.5 text-[10px] text-slate-400">
                    <CheckCircle2 className="size-3.5" />
                    Data perusahaan dan administrator terlindungi.
                </div>
            </form>
        </>
    );
}

RegisterCompany.layout = {
    title: "Buat workspace perusahaan",
    description: "Daftarkan perusahaan untuk mulai menggunakan CRM Anda.",
};

function SectionHeading({
    icon: Icon,
    eyebrow,
    title,
    description,
}: {
    icon: React.ComponentType<{ className?: string }>;
    eyebrow: string;
    title: string;
    description: string;
}) {
    return (
        <div className="flex gap-2.5">
            <div className="flex size-8 shrink-0 items-center justify-center rounded-lg bg-blue-50 text-[#1769e0] dark:bg-blue-950/50">
                <Icon className="size-4" />
            </div>
            <div className="min-w-0">
                <p className="text-[9px] font-bold uppercase tracking-[0.15em] text-slate-400">
                    {eyebrow}
                </p>
                <h2 className="text-sm font-bold text-slate-900 dark:text-white">
                    {title}
                </h2>
                <p className="mt-0.5 text-[10px] leading-4 text-slate-500 dark:text-slate-400">
                    {description}
                </p>
            </div>
        </div>
    );
}

function Field({
    label,
    error,
    icon: Icon,
    children,
}: {
    label: string;
    error?: string;
    icon?: React.ComponentType<{ className?: string }>;
    children: React.ReactNode;
}) {
    return (
        <div className="space-y-1.5">
            <Label className="text-[11px] font-medium text-slate-700 dark:text-slate-300">
                {label}
            </Label>
            <div className="relative">
                {Icon && (
                    <Icon className="pointer-events-none absolute left-3 top-1/2 z-10 size-3.5 -translate-y-1/2 text-slate-400" />
                )}
                <div className={Icon ? "[&>input]:pl-9 [&>textarea]:pl-9" : ""}>
                    {children}
                </div>
            </div>
            <InputError message={error} />
        </div>
    );
}
