"use client"
import type React from "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 { Textarea } from "@/components/ui/textarea"
import { Checkbox } from "@/components/ui/checkbox"
import { RadioGroup, RadioGroupItem } from "@/components/ui/radio-group"
import Link from "next/link"
import { useState } from "react"
export default function RegisterPage() {
const [step, setStep] = useState<"form" | "payment">("form")
const [isSubmitting, setIsSubmitting] = useState(false)
const [includeAccommodation, setIncludeAccommodation] = useState(true)
const [accommodationType, setAccommodationType] = useState<"dorm" | "double">("dorm")
const [includeFood, setIncludeFood] = useState(true)
const [formData, setFormData] = useState({
name: "",
contact: "",
contributions: "",
expectations: "",
howHeard: "",
dietary: [] as string[],
dietaryOther: "",
crewConsent: "",
})
const baseTicketPrice = 80 // Early bird price €80
const dormPrice = 235.20 // €39.20/night x 6 nights
const doublePrice = 301.20 // €50.20/night x 6 nights
const foodPrice = 135 // 6 days of meals
const accommodationPrice = accommodationType === "dorm" ? dormPrice : doublePrice
const totalPrice =
baseTicketPrice +
(includeAccommodation ? accommodationPrice : 0) +
(includeFood ? foodPrice : 0)
const handleSubmit = async (e: React.FormEvent) => {
e.preventDefault()
// Validate required fields
if (
!formData.name ||
!formData.contact ||
!formData.contributions ||
!formData.expectations ||
!formData.crewConsent
) {
alert("Please fill in all required fields")
return
}
setIsSubmitting(true)
try {
// Submit registration to Google Sheet first
const dietaryString =
formData.dietary.join(", ") +
(formData.dietaryOther ? `, ${formData.dietaryOther}` : "")
const response = await fetch("/api/register", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({
name: formData.name,
contact: formData.contact,
contributions: formData.contributions,
expectations: formData.expectations,
howHeard: formData.howHeard,
dietary: dietaryString,
crewConsent: formData.crewConsent,
}),
})
if (!response.ok) {
throw new Error("Failed to record registration")
}
// Proceed to payment step
setStep("payment")
} catch (error) {
console.error("Registration error:", error)
alert("There was an error recording your registration. Please try again.")
} finally {
setIsSubmitting(false)
}
}
const handleDietaryChange = (value: string, checked: boolean) => {
setFormData((prev) => ({
...prev,
dietary: checked ? [...prev.dietary, value] : prev.dietary.filter((item) => item !== value),
}))
}
if (step === "payment") {
return (
{/* Header */}
Complete Your Registration
Choose your payment method
Event Registration
Early bird pricing available until March 31, 2026
{/* Ticket */}
CCG 2026 Ticket
€80 Early bird (until Mar 31) · €120 Regular (Apr-Jun) · €150 Late (after Jul 1)
CCA members: Bring two newcomers, get a free ticket!
€{baseTicketPrice.toFixed(2)}
{/* Accommodation */}
setIncludeAccommodation(checked as boolean)}
className="mt-1"
/>
{includeAccommodation && (
€{accommodationPrice.toFixed(2)}
)}
{includeAccommodation ? (
setAccommodationType(value as "dorm" | "double")}
className="space-y-2"
>
30 beds on-site. Nearby options (Herrnhof.at, Gasthof Kobald) also available — see{" "}
Transparency page.
) : (
I'll arrange my own accommodation
)}
{/* Food */}
setIncludeFood(checked as boolean)}
className="mt-1"
/>
{includeFood && (
€{foodPrice.toFixed(2)}
)}
{includeFood ? (
Breakfast buffet, catered lunches & dinners (vegetarian/vegan + meat options),
coffee & tea throughout the day.
) : (
I'll arrange my own meals
)}
{(includeAccommodation || includeFood) && (
We'll follow up with you closer to the event to confirm accommodation and food details,
including room assignments and any dietary needs.
)}
{/* Total */}
Total Amount
Ticket{includeAccommodation ? " + accommodation" : ""}{includeFood ? " + food" : ""}
€{totalPrice.toFixed(2)}
{/* Payment Methods */}
Payment Options
Choose your preferred payment method
All payments are processed securely through Mollie. You'll receive a confirmation email after successful
payment.
{/* Footer */}
)
}
return (
{/* Header */}
Register for CCG 2026
August 16-22, 2026 at the Commons Hub in Austria
Registration Form
Tell us about yourself and what you'd like to bring to CCG
{/* Footer */}
)
}