
final class UserDetailsSheet : Sheet {
    private let sessionID: String
    
    init(for sessionID: String) {
        self.sessionID = sessionID
        super.init(nibName: nil, bundle: nil)
    }
    
    override init(nibName: String?, bundle: Bundle?) {
        preconditionFailure("Use init(for:) instead.")
    }
    
    required init?(coder: NSCoder) {
        preconditionFailure("Use init(for:) instead.")
    }
    
    override func populateContentView() {
        // Profile picture view
        let profilePictureView = ProfilePictureView()
        let size = Values.largeProfilePictureSize
        profilePictureView.size = size
        profilePictureView.set(.width, to: size)
        profilePictureView.set(.height, to: size)
        profilePictureView.publicKey = sessionID
        profilePictureView.update()
        // Display name label
        let displayNameLabel = UILabel()
        let displayName = Storage.shared.getContact(with: sessionID)?.displayName(for: .regular) ?? sessionID
        displayNameLabel.text = displayName
        displayNameLabel.font = .boldSystemFont(ofSize: Values.largeFontSize)
        displayNameLabel.textColor = Colors.text
        displayNameLabel.numberOfLines = 1
        displayNameLabel.lineBreakMode = .byTruncatingTail
        // Session ID label
        let sessionIDLabel = UILabel()
        sessionIDLabel.textColor = Colors.text
        sessionIDLabel.font = Fonts.spaceMono(ofSize: isIPhone5OrSmaller ? Values.mediumFontSize : 20)
        sessionIDLabel.numberOfLines = 0
        sessionIDLabel.lineBreakMode = .byCharWrapping
        sessionIDLabel.accessibilityLabel = "Session ID label"
        sessionIDLabel.text = sessionID
        // Session ID label container
        let sessionIDLabelContainer = UIView()
        sessionIDLabelContainer.addSubview(sessionIDLabel)
        sessionIDLabel.pin(to: sessionIDLabelContainer, withInset: Values.mediumSpacing)
        sessionIDLabelContainer.layer.cornerRadius = TextField.cornerRadius
        sessionIDLabelContainer.layer.borderWidth = 1
        sessionIDLabelContainer.layer.borderColor = isLightMode ? UIColor.black.cgColor : UIColor.white.cgColor
        // Copy button
        let copyButton = Button(style: .prominentOutline, size: .medium)
        copyButton.setTitle(NSLocalizedString("copy", comment: ""), for: UIControl.State.normal)
        copyButton.addTarget(self, action: #selector(copySessionID), for: UIControl.Event.touchUpInside)
        copyButton.set(.width, to: 160)
        // Stack view
        let stackView = UIStackView(arrangedSubviews: [ profilePictureView, displayNameLabel, sessionIDLabelContainer, copyButton, UIView.vSpacer(Values.largeSpacing) ])
        stackView.axis = .vertical
        stackView.spacing = Values.largeSpacing
        stackView.alignment = .center
        // Constraints
        contentView.addSubview(stackView)
        stackView.pin(to: contentView, withInset: Values.largeSpacing)
    }
    
    @objc private func copySessionID() {
        UIPasteboard.general.string = sessionID
        presentingViewController?.dismiss(animated: true, completion: nil)
    }
}
