export function createErrorBoundary(React, options = {}) {
    const { onError, fallback, logErrors = true, recovery = 'none' } = options;
    return class ErrorBoundary extends React.Component {
        constructor(props) {
            super(props);
            this.handleRetry = () => {
                this.setState((prevState) => ({
                    hasError: false,
                    error: null,
                    errorInfo: null,
                    retryCount: prevState.retryCount + 1
                }));
            };
            this.handleReset = () => {
                this.setState({
                    hasError: false,
                    error: null,
                    errorInfo: null,
                    retryCount: 0
                });
            };
            this.state = {
                hasError: false,
                error: null,
                errorInfo: null,
                retryCount: 0
            };
        }
        static getDerivedStateFromError(error) {
            return { hasError: true, error };
        }
        componentDidCatch(error, errorInfo) {
            if (logErrors) {
                console.error('React Error Boundary caught error:', error);
                console.error('Error Info:', errorInfo);
            }
            if (onError) {
                try {
                    onError(error, errorInfo);
                }
                catch (handlerError) {
                    console.error('Error in custom error handler:', handlerError);
                }
            }
            this.setState({ errorInfo });
        }
        render() {
            if (this.state.hasError) {
                if (fallback) {
                    if (typeof fallback === 'function') {
                        return fallback({
                            error: this.state.error,
                            errorInfo: this.state.errorInfo,
                            retry: this.handleRetry,
                            reset: this.handleReset,
                            retryCount: this.state.retryCount
                        });
                    }
                    return fallback;
                }
                const showRetry = recovery === 'retry' && this.state.retryCount < 3;
                const showReset = recovery === 'reset';
                return React.createElement('div', {
                    style: {
                        padding: '20px',
                        backgroundColor: '#f8f8f8',
                        border: '1px solid #ddd',
                        borderRadius: '4px',
                        margin: '10px'
                    }
                }, React.createElement('h2', { style: { color: '#d32f2f' } }, 'Component Error'), React.createElement('p', { style: { color: '#666' } }, 'An error occurred while rendering this component.'), this.state.error && React.createElement('details', { style: { marginTop: '10px' } }, React.createElement('summary', { style: { cursor: 'pointer', color: '#333' } }, 'Error Details'), React.createElement('pre', {
                    style: {
                        backgroundColor: '#f0f0f0',
                        padding: '10px',
                        marginTop: '10px',
                        overflow: 'auto',
                        fontSize: '12px'
                    }
                }, this.state.error.toString(), '\n\n', this.state.error.stack)), (showRetry || showReset) && React.createElement('div', { style: { marginTop: '10px' } }, showRetry && React.createElement('button', {
                    onClick: this.handleRetry,
                    style: {
                        padding: '8px 16px',
                        marginRight: '10px',
                        backgroundColor: '#1976d2',
                        color: 'white',
                        border: 'none',
                        borderRadius: '4px',
                        cursor: 'pointer'
                    }
                }, `Retry (${3 - this.state.retryCount} attempts left)`), showReset && React.createElement('button', {
                    onClick: this.handleReset,
                    style: {
                        padding: '8px 16px',
                        backgroundColor: '#757575',
                        color: 'white',
                        border: 'none',
                        borderRadius: '4px',
                        cursor: 'pointer'
                    }
                }, 'Reset Component')));
            }
            return this.props.children;
        }
    };
}
export function withErrorBoundary(React, Component, options = {}) {
    const ErrorBoundaryComponent = createErrorBoundary(React, options);
    return (props) => {
        return React.createElement(ErrorBoundaryComponent, null, React.createElement(Component, props));
    };
}
export function formatComponentError(error, componentName, phase) {
    return {
        message: error.message || 'Unknown error',
        stack: error.stack,
        componentName,
        phase,
        details: {
            name: error.name,
            timestamp: new Date().toISOString()
        }
    };
}
export function createErrorLogger(componentName) {
    return (error, errorInfo) => {
        console.group(`🚨 React Component Error: ${componentName}`);
        console.error('Error:', error);
        console.error('Component Stack:', errorInfo.componentStack);
        console.error('Props:', errorInfo.props);
        console.groupEnd();
    };
}
//# sourceMappingURL=error-boundary.js.map