'use client';

import { Component, ReactNode } from 'react';

interface ErrorBoundaryProps {
  children: ReactNode;
  fallback?: ReactNode;
  onReset?: () => void;
}

interface ErrorBoundaryState {
  hasError: boolean;
  error?: Error;
}

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

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

  render() {
    if (this.state.hasError) {
      if (this.props.fallback) return this.props.fallback;
      return (
        <div className="p-4 bg-red-900/20 border border-red-600/50 rounded">
          <h3 className="text-red-400 font-bold mb-2">Something went wrong:</h3>
          <pre className="text-xs text-red-300">{this.state.error?.message}</pre>
          <pre className="text-xs text-gray-500 mt-2">{this.state.error?.stack}</pre>
          {this.props.onReset && (
            <button
              onClick={this.props.onReset}
              className="mt-3 px-3 py-1 bg-red-700 hover:bg-red-600 text-white text-xs rounded"
            >
              Reset &amp; Recover
            </button>
          )}
        </div>
      );
    }

    return this.props.children;
  }
}
