import { Component, type ReactNode } from "react"
import { AlertTriangle, Home, RotateCcw } from "lucide-react"
import { Link } from "react-router"

interface Props {
  children: ReactNode
}

interface State {
  hasError: boolean
  error?: Error
}

export class ErrorBoundary extends Component<Props, State> {
  constructor(props: Props) {
    super(props)
    this.state = { hasError: false }
  }

  static getDerivedStateFromError(error: Error): State {
    return { hasError: true, error }
  }

  componentDidCatch(error: Error, errorInfo: React.ErrorInfo) {
    // eslint-disable-next-line no-console
    console.error("ErrorBoundary caught:", error, errorInfo)
  }

  handleReset = () => {
    this.setState({ hasError: false, error: undefined })
  }

  render() {
    if (this.state.hasError) {
      return (
        <div className="min-h-screen bg-[#030712] text-white flex items-center justify-center px-4">
          <div className="max-w-md w-full text-center">
            <div className="w-20 h-20 rounded-full bg-red-500/10 flex items-center justify-center mx-auto mb-6">
              <AlertTriangle className="w-10 h-10 text-red-400" />
            </div>
            <h1 className="text-2xl font-bold mb-3">Something went wrong</h1>
            <p className="text-slate-400 mb-8">
              We apologize for the inconvenience. Please try refreshing the page or return home.
            </p>
            <div className="flex flex-col sm:flex-row gap-3 justify-center">
              <button
                onClick={this.handleReset}
                className="btn-primary flex items-center justify-center gap-2"
              >
                <RotateCcw className="w-4 h-4" /> Try Again
              </button>
              <Link
                to="/"
                className="px-6 py-3 rounded-full border border-white/20 hover:bg-white/5 transition-all flex items-center justify-center gap-2"
              >
                <Home className="w-4 h-4" /> Go Home
              </Link>
            </div>
            {import.meta.env.DEV && this.state.error && (
              <pre className="mt-8 p-4 rounded-xl bg-red-500/5 border border-red-500/10 text-left text-xs text-red-300 overflow-auto">
                {this.state.error.toString()}
              </pre>
            )}
          </div>
        </div>
      )
    }

    return this.props.children
  }
}
