import Foundation

struct ToolTimelineRowInteractionPolicy: Equatable {
    enum ExpandedMode: Equatable {
        case bash(unwrapped: Bool)
        case diff
        case code
        case markdown
        case readMedia
        case status
        case text
    }

    let mode: ExpandedMode
    let enablesTapCopyGesture: Bool
    let enablesPinchGesture: Bool
    let supportsFullScreenPreview: Bool
    let allowsHorizontalScroll: Bool

    static func forExpandedContent(
        _ content: ToolPresentationBuilder.ToolExpandedContent,
        isDone: Bool
    ) -> Self {
        let mode = ExpandedMode(content)
        let supportsFullScreenPreview = supportsFullScreenPreview(mode: mode)

        switch mode {
        case .bash(let unwrapped):
            return Self(
                mode: mode,
                enablesTapCopyGesture: true,
                enablesPinchGesture: true,
                supportsFullScreenPreview: supportsFullScreenPreview,
                allowsHorizontalScroll: unwrapped && isDone
            )

        case .diff, .code:
            return Self(
                mode: mode,
                enablesTapCopyGesture: true,
                enablesPinchGesture: true,
                supportsFullScreenPreview: supportsFullScreenPreview,
                allowsHorizontalScroll: isDone
            )

        case .markdown:
            return Self(
                mode: mode,
                enablesTapCopyGesture: true,
                enablesPinchGesture: true,
                supportsFullScreenPreview: supportsFullScreenPreview,
                allowsHorizontalScroll: false
            )

        case .readMedia, .status:
            return Self(
                mode: mode,
                enablesTapCopyGesture: false,
                enablesPinchGesture: false,
                supportsFullScreenPreview: false,
                allowsHorizontalScroll: false
            )

        case .text:
            return Self(
                mode: mode,
                enablesTapCopyGesture: true,
                enablesPinchGesture: true,
                supportsFullScreenPreview: supportsFullScreenPreview,
                allowsHorizontalScroll: false
            )
        }
    }

    private static func supportsFullScreenPreview(mode: ExpandedMode) -> Bool {
        switch mode {
        case .diff, .code, .markdown, .bash, .text:
            return true
        case .readMedia, .status:
            return false
        }
    }
}

private extension ToolTimelineRowInteractionPolicy.ExpandedMode {
    init(_ content: ToolPresentationBuilder.ToolExpandedContent) {
        switch content {
        case .bash(_, _, let unwrapped):
            self = .bash(unwrapped: unwrapped)
        case .diff:
            self = .diff
        case .code:
            self = .code
        case .markdown:
            self = .markdown
        case .readMedia:
            self = .readMedia
        case .status:
            self = .status
        case .text:
            self = .text
        }
    }
}
