"use client"

import Link from "next/link"
import { useState } from "react"
import { useRouter } from "next/navigation"
import { toast } from "sonner"

import { Card, CardContent, CardHeader, CardTitle, CardDescription, CardFooter } from "@/shared/components/ui/card"
import { Badge } from "@/shared/components/ui/badge"
import { Button } from "@/shared/components/ui/button"
import { EmptyState } from "@/shared/components/ui/empty-state"
import { Input } from "@/shared/components/ui/input"
import { Label } from "@/shared/components/ui/label"
import { BookOpen, Building2, Inbox, CalendarDays, User, PlusCircle, PenTool } from "lucide-react"

import type { StudentEnrolledClass } from "@/modules/classes/types"
import { joinClassByInvitationCodeAction } from "@/modules/classes/actions"

export function StudentCoursesView({
  classes,
}: {
  classes: StudentEnrolledClass[]
}) {
  const router = useRouter()
  const [code, setCode] = useState("")
  const [isWorking, setIsWorking] = useState(false)

  const handleJoin = async (formData: FormData) => {
    setIsWorking(true)
    try {
      const res = await joinClassByInvitationCodeAction(null, formData)
      if (res.success) {
        toast.success(res.message || "Joined class")
        setCode("")
        router.refresh()
      } else {
        toast.error(res.message || "Failed to join class")
      }
    } catch {
      toast.error("Failed to join class")
    } finally {
      setIsWorking(false)
    }
  }

  return (
    <div className="space-y-8">
      {classes.length > 0 && (
        <div className="grid gap-6 md:grid-cols-2 lg:grid-cols-3">
          {classes.map((c) => (
            <Card key={c.id} className="flex flex-col overflow-hidden transition-all hover:shadow-md">
              <CardHeader className="bg-muted/30 pb-4">
                <div className="flex items-start justify-between gap-4">
                  <div className="space-y-1">
                    <CardTitle className="line-clamp-1 text-lg">{c.name}</CardTitle>
                    <CardDescription className="flex items-center gap-2 text-xs">
                      <span className="flex items-center gap-1">
                        <BookOpen className="h-3 w-3" />
                        Grade {c.grade}
                      </span>
                      {c.homeroom && (
                        <>
                          <span>•</span>
                          <span>{c.homeroom}</span>
                        </>
                      )}
                    </CardDescription>
                  </div>
                  <Badge variant="secondary" className="shrink-0">
                    Active
                  </Badge>
                </div>
              </CardHeader>
              
              <CardContent className="flex-1 space-y-4 py-4">
                <div className="space-y-2 text-sm">
                  {c.teacherName && (
                    <div className="flex items-center gap-2 text-muted-foreground">
                      <User className="h-4 w-4" />
                      <span>{c.teacherName}</span>
                    </div>
                  )}
                  {c.room && (
                    <div className="flex items-center gap-2 text-muted-foreground">
                      <Building2 className="h-4 w-4" />
                      <span>Room {c.room}</span>
                    </div>
                  )}
                </div>
              </CardContent>

              <CardFooter className="flex gap-2 border-t bg-muted/10 p-4">
                <Button asChild variant="outline" size="sm" className="flex-1">
                  <Link href={`/student/schedule?classId=${encodeURIComponent(c.id)}`}>
                    <CalendarDays className="mr-2 h-4 w-4" />
                    Schedule
                  </Link>
                </Button>
                <Button asChild size="sm" className="flex-1">
                  <Link href={`/student/learning/assignments?classId=${encodeURIComponent(c.id)}`}>
                    <PenTool className="mr-2 h-4 w-4" />
                    Assignments
                  </Link>
                </Button>
              </CardFooter>
            </Card>
          ))}
        </div>
      )}

      {classes.length === 0 && (
        <EmptyState
          icon={Inbox}
          title="No courses yet"
          description="You are not enrolled in any classes. Join a class to get started."
          className="py-12"
        />
      )}

      <div className="rounded-lg border bg-card p-6 shadow-sm">
        <div className="mb-6 flex items-center gap-3">
          <div className="flex h-10 w-10 items-center justify-center rounded-full bg-primary/10">
            <PlusCircle className="h-5 w-5 text-primary" />
          </div>
          <div>
            <h3 className="text-lg font-semibold">Join a Class</h3>
            <p className="text-sm text-muted-foreground">
              Enter the invitation code provided by your teacher to enroll.
            </p>
          </div>
        </div>

        <form action={handleJoin} className="flex flex-col gap-4 sm:flex-row sm:items-end">
          <div className="flex-1 space-y-2">
            <Label htmlFor="join-invitation-code">Invitation Code</Label>
            <Input
              id="join-invitation-code"
              name="code"
              inputMode="numeric"
              autoComplete="one-time-code"
              placeholder="Enter 6-digit code"
              value={code}
              onChange={(e) => setCode(e.target.value)}
              maxLength={6}
              className="max-w-md font-mono tracking-widest"
              required
            />
          </div>
          <Button type="submit" disabled={isWorking} size="lg">
            {isWorking ? "Joining..." : "Join Class"}
          </Button>
        </form>
      </div>
    </div>
  )
}
