import Messages
import MessageUI
import SwiftUI

public struct SMSComposeView: UIViewControllerRepresentable {
    public var recipient: String?
    public var messageBody: String
    public var disableUserAttachments: Bool
    public var completionHandler: (MessageComposeResult) -> Void

    public enum Error: Swift.Error {
        case unsupportedDevice
    }

    public init(
        recipient: String? = nil,
        messageBody: String,
        disableUserAttachments: Bool = false,
        withCompletionHandler completionHandler: @escaping (MessageComposeResult) -> Void = { _ in }
    ) throws {
        guard Self.canSendText() else {
            throw Error.unsupportedDevice
        }
        self.recipient = recipient
        self.messageBody = messageBody
        self.disableUserAttachments = disableUserAttachments
        self.completionHandler = completionHandler
    }

    public func makeUIViewController(context: Context) -> MFMessageComposeViewController {
        let composeVC = MFMessageComposeViewController()
        composeVC.messageComposeDelegate = context.coordinator
        composeVC.body = self.messageBody
        if let recipient {
            composeVC.recipients = [recipient]
        }
        if disableUserAttachments {
            composeVC.disableUserAttachments()
        }
        return composeVC
    }

    public func updateUIViewController(_: MFMessageComposeViewController, context _: Context) {}

    public func makeCoordinator() -> MCCoordinator {
        MCCoordinator(self)
    }
}

public extension SMSComposeView {
    class MCCoordinator: NSObject, MFMessageComposeViewControllerDelegate {
        var parent: SMSComposeView

        init(_ parent: SMSComposeView) {
            self.parent = parent
        }

        public func messageComposeViewController(_ controller: MFMessageComposeViewController, didFinishWith result: MessageComposeResult) {
            controller.dismiss(animated: true, completion: nil)
            parent.completionHandler(result)
        }
    }

    static func canSendText() -> Bool {
        MFMessageComposeViewController.canSendText()
    }
}
