// Copyright © 2024 Rangeproof Pty Ltd. All rights reserved.

import SwiftUI
import SessionUIKit
import SignalUtilitiesKit
import SessionUtilitiesKit

struct StartConversationScreen: View {
    @EnvironmentObject var host: HostWrapper
    private let dependencies: Dependencies
    
    init(using dependencies: Dependencies) {
        self.dependencies = dependencies
    }
    
    var body: some View {
        ZStack(alignment: .topLeading) {
            ScrollView(.vertical, showsIndicators: false) {
                VStack(
                    alignment: .leading,
                    spacing: Values.smallSpacing
                ) {
                    VStack(
                        alignment: .center,
                        spacing: 0
                    ) {
                        let title: String = "messageNew"
                            .putNumber(1)
                            .localized()
                        NewConversationCell(
                            image: "Message", // stringlint:disable
                            title: title
                        ) {
                            let viewController: SessionHostingViewController = SessionHostingViewController(
                                rootView: NewMessageScreen(using: dependencies)
                            )
                            viewController.setNavBarTitle(title)
                            viewController.setUpDismissingButton(on: .right)
                            self.host.controller?.navigationController?.pushViewController(viewController, animated: true)
                        }
                        .accessibility(
                            Accessibility(
                                identifier: "New direct message",
                                label: "New direct message"
                            )
                        )
                        
                        Line(color: .borderSeparator)
                            .padding(.leading, 38 + Values.smallSpacing)
                            .padding(.trailing, -Values.largeSpacing)
                        
                        NewConversationCell(
                            image: "Group",
                            title: "groupCreate".localized()
                        ) {
                            let viewController = NewClosedGroupVC(using: dependencies)
                            self.host.controller?.navigationController?.pushViewController(viewController, animated: true)
                        }
                        .accessibility(
                            Accessibility(
                                identifier: "Create group",
                                label: "Create group"
                            )
                        )
                        
                        Line(color: .borderSeparator)
                            .padding(.leading, 38 + Values.smallSpacing)
                            .padding(.trailing, -Values.largeSpacing)
                        
                        NewConversationCell(
                            image: "Globe",
                            title: "communityJoin".localized()
                        ) {
                            let viewController = JoinOpenGroupVC(using: dependencies)
                            self.host.controller?.navigationController?.pushViewController(viewController, animated: true)
                        }
                        .accessibility(
                            Accessibility(
                                identifier: "Join community",
                                label: "Join community"
                            )
                        )
                        
                        Line(color: .borderSeparator)
                            .padding(.leading, 38 + Values.smallSpacing)
                            .padding(.trailing, -Values.largeSpacing)
                        
                        NewConversationCell(
                            image: "icon_invite",
                            title: "sessionInviteAFriend".localized()
                        ) {
                            let viewController: SessionHostingViewController = SessionHostingViewController(
                                rootView: InviteAFriendScreen(accountId: dependencies[cache: .general].sessionId.hexString)
                            )
                            viewController.setNavBarTitle("sessionInviteAFriend".localized())
                            viewController.setUpDismissingButton(on: .right)
                            self.host.controller?.navigationController?.pushViewController(viewController, animated: true)
                        }
                        .accessibility(
                            Accessibility(
                                identifier: "Invite friend button",
                                label: "Invite friend button"
                            )
                        )
                    }
                    .padding(.bottom, Values.mediumSpacing)
                    
                    Text("accountIdYours".localized())
                        .font(.system(size: Values.mediumLargeFontSize))
                        .foregroundColor(themeColor: .textPrimary)
                    
                    Text("qrYoursDescription".localized())
                        .font(.system(size: Values.verySmallFontSize))
                        .foregroundColor(themeColor: .textSecondary)
                    
                    QRCodeView(
                        string: dependencies[cache: .general].sessionId.hexString,
                        hasBackground: false,
                        logo: "SessionWhite40", // stringlint:disable
                        themeStyle: ThemeManager.currentTheme.interfaceStyle
                    )
                    .aspectRatio(1, contentMode: .fit)
                    .padding(.vertical, Values.smallSpacing)
                }
                .padding(.horizontal, Values.largeSpacing)
            }
        }
        .backgroundColor(themeColor: .backgroundSecondary)
    }
}

fileprivate struct NewConversationCell: View {
    let image: String
    let title: String
    let action: () -> ()
    
    var body: some View {
        Button {
            action()
        } label: {
            HStack(
                alignment: .center,
                spacing: Values.smallSpacing
            ) {
                ZStack(alignment: .center) {
                    Image(image)
                        .renderingMode(.template)
                        .foregroundColor(themeColor: .textPrimary)
                        .frame(width: 25, height: 24, alignment: .bottom)
                }
                .frame(width: 38, height: 38, alignment: .leading)
                
                Text(title)
                    .font(.system(size: Values.mediumLargeFontSize))
                    .foregroundColor(themeColor: .textPrimary)
                    .frame(
                        maxWidth: .infinity,
                        alignment: .leading
                    )
            }
            .frame(height: 55)
        }
    }
}

#Preview {
    StartConversationScreen(using: Dependencies.createEmpty())
}