import SwiftUI

public struct FailedView: View {
    private let title: String
    private let message: String
    private let buttonTitle: String
    private let action: () -> Void

    public init(title: String, message: String, buttonTitle: String, action: @escaping () -> Void) {
        self.title = title
        self.message = message
        self.buttonTitle = buttonTitle
        self.action = action
    }

    public var body: some View {
        VStack(alignment: .center, spacing: 34) {
            Spacer()

            Text(title)
                .typographyV1(.headline3)
                .foregroundColor(Color.SemanticV1.textPrimary)

            Text(message)
                .multilineTextAlignment(.center)
                .foregroundStyle(Color.SemanticV1.textSecondary)
                .typographyV1(.body1)
                .lineLimit(10)
                .padding(.bottom, 16)
                .fixedSize(horizontal: false, vertical: true)

            Button {
                action()
            } label: {
                Text(buttonTitle)
                    .typographyV1(.button1)
                    .foregroundColor(Color.SemanticV1.textPrimary)
            }
            .buttonStyle(.bordered)

            Spacer()
        }
        .frame(maxWidth: .infinity, alignment: .center)
        .padding(34)
    }
}

struct FailedView_Previews: PreviewProvider {
    static var previews: some View {
        FailedViewSample(message: "Error message appears here")
    }
}

struct FailedViewSample: View {
    let message: String

    init(message: String) {
        self.message = message
    }

    var body: some View {
        VStack {
            FailedView(title: "Something went wrong", message: message, buttonTitle: "Retry", action: {})
            FailedView(title: "Something went wrong", message: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam commodo, massa in maximus varius, dui massa iaculis nisl, vel mattis elit eros id purus. Ut quis iaculis ligula. Cras in ipsum lectus. Etiam vulputate enim risus, vel dictum arcu pellentesque at. Morbi fringilla accumsan leo, id mollis orci condimentum vitae. Sed hendrerit efficitur nisi, vulputate aliquam leo elementum ut. Nunc molestie, tellus vitae ornare venenatis, nisl ipsum mattis risus, varius sollicitudin lacus enim eu mi.", buttonTitle: "Retry", action: {})
        }
        .padding()
    }
}
