//
//  UserProfileView.swift
//  SodaLive
//
//  Created by klaus on 2023/08/11.
//

import SwiftUI

struct UserProfileView: View {
    
    let userId: Int
    @StateObject var viewModel = UserProfileViewModel()
    
    var body: some View {
        GeometryReader { proxy in
            BaseView(isLoading: $viewModel.isLoading) {
                VStack(spacing: 0) {
                    HStack(spacing: 0) {
                        Button {
                            AppState.shared.back()
                        } label: {
                            Image("ic_back")
                                .resizable()
                                .frame(width: 20, height: 20)
                            
                            Text(viewModel.navigationTitle)
                                .font(.custom(Font.bold.rawValue, size: 18.3))
                                .foregroundColor(Color(hex: "eeeeee"))
                        }
                        
                        Spacer()
                        
                        if userId != UserDefaults.int(forKey: .userId) {
                            Image("ic_seemore_vertical")
                                .onTapGesture {
                                    viewModel.isShowReportMenu = true
                                }
                        }
                    }
                    .padding(.horizontal, 13.3)
                    .frame(height: 50)
                    .background(Color.black)
                    
                    ScrollView(.vertical, showsIndicators: false) {
                        VStack(spacing: 0) {
                            if let creatorProfile = viewModel.creatorProfile {
                                UserProfileCreatorView(
                                    creator: creatorProfile.creator) {
                                        viewModel.creatorFollow()
                                    } creatorUnFollow: {
                                        viewModel.creatorUnFollow()
                                    } shareChannel: {
                                        viewModel.shareChannel(userId: userId)
                                    }
                                
                                UserProfileActivitySummaryView(item: creatorProfile.activitySummary)
                                    .padding(.top, 13.3)
                                    .padding(.horizontal, 13.3)
                                
                                HStack(spacing: 0) {
                                    Text(
                                        creatorProfile.notice.trimmingCharacters(in: .whitespaces).isEmpty ?
                                        "공지사항이 없습니다." :
                                            creatorProfile.notice
                                    )
                                    .font(.custom(Font.medium.rawValue, size: 13.3))
                                    .foregroundColor(Color(hex: "000000"))
                                    .lineLimit(viewModel.isExpandNotice ? Int.max : 1)
                                    
                                    Spacer()
                                    
                                    if creatorProfile.creator.creatorId == UserDefaults.int(forKey: .userId) {
                                        Image("ic_review")
                                            .resizable()
                                            .frame(width: 20, height: 20)
                                    }
                                }
                                .padding(.horizontal, 26.7)
                                .padding(.vertical, 13.3)
                                .background(Color(hex: "fdca2f"))
                                .padding(.top, 13.3)
                                .onTapGesture {
                                    if creatorProfile.creator.creatorId == UserDefaults.int(forKey: .userId) {
                                        AppState.shared.setAppStep(step: .creatorNoticeWrite(notice: creatorProfile.notice))
                                    } else {
                                        viewModel.isExpandNotice.toggle()
                                    }
                                }
                                
                                if creatorProfile.contentList.count > 0 ||
                                    userId == UserDefaults.int(forKey: .userId)
                                {
                                    UserProfileContentView(
                                        userId: userId,
                                        items: creatorProfile.contentList
                                    )
                                    .padding(.top, 46.7)
                                    .padding(.horizontal, 13.3)
                                }
                                
                                if creatorProfile.liveRoomList.count > 0 {
                                    UserProfileLiveView(
                                        userId: userId,
                                        liveRoomList: creatorProfile.liveRoomList,
                                        onClickParticipant: { liveRoom in
                                            if creatorProfile.creator.creatorId == UserDefaults.int(forKey: .userId) {
                                                viewModel.errorMessage = "현재 라이브 중입니다."
                                                viewModel.isShowPopup = true
                                            } else {
                                                AppState.shared.isShowPlayer = false
                                                DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) {
                                                    viewModel.enterLiveRoom(roomId: liveRoom.roomId)
                                                }
                                            }
                                        },
                                        onClickReservation: { liveRoom in
                                            if creatorProfile.creator.creatorId == UserDefaults.int(forKey: .userId) {
                                                viewModel.errorMessage = "내가 만든 라이브는 예약할 수 없습니다."
                                                viewModel.isShowPopup = true
                                            } else {
                                                viewModel.reservationLiveRoom(roomId: liveRoom.roomId)
                                            }
                                        }
                                    )
                                    .padding(.top, 46.7)
                                    .padding(.horizontal, 13.3)
                                }
                                
                                VStack(spacing: 26.7) {
                                    let introduce = creatorProfile.creator.introduce
                                    UserProfileIntroduceView(
                                        introduce: introduce.trimmingCharacters(in: .whitespaces).count <= 0 ?
                                        "채널 소개내용이 없습니다." :
                                            introduce)
                                    
                                    Rectangle()
                                        .frame(height: 1)
                                        .foregroundColor(Color(hex: "909090").opacity(0.5))
                                        .padding(.horizontal, 13.3)
                                }
                                .padding(.top, 26.7)
                                
                                if creatorProfile.userDonationRanking.count > 0 {
                                    VStack(spacing: 26.7) {
                                        UserProfileDonationView(userId: userId, donationRankingResponse: creatorProfile.userDonationRanking)
                                            .padding(.horizontal, 13.3)
                                        
                                        Rectangle()
                                            .frame(height: 6.7)
                                            .foregroundColor(Color(hex: "909090").opacity(0.5))
                                    }
                                    .padding(.top, 26.7)
                                }
                                
                                VStack(spacing: 26.7) {
                                    UserProfileSimilarCreatorView(
                                        creators: creatorProfile.similarCreatorList,
                                        onClickCreator: { viewModel.getCreatorProfile(userId: $0) }
                                    )
                                    .padding(.horizontal, 13.3)
                                    
                                    Rectangle()
                                        .frame(height: 6.7)
                                        .foregroundColor(Color(hex: "909090").opacity(0.5))
                                }
                                .padding(.top, 26.7)
                                
                                UserProfileFanTalkView(
                                    userId: userId,
                                    cheers: creatorProfile.cheers,
                                    errorPopup: { message in
                                        viewModel.errorMessage = message
                                        viewModel.isShowPopup = true
                                    },
                                    reportPopup: { cheerId in
                                        viewModel.reportCheersId = cheerId
                                        viewModel.isShowCheersReportMenu = true
                                    },
                                    isLoading: $viewModel.isLoading
                                )
                                .padding(.top, 26.7)
                            }
                        }
                    }
                }
                .popup(isPresented: $viewModel.isShowPopup, type: .toast, position: .bottom, autohideIn: 2) {
                    HStack {
                        Spacer()
                        Text(viewModel.errorMessage)
                            .padding(.vertical, 13.3)
                            .frame(width: screenSize().width - 66.7, alignment: .center)
                            .font(.custom(Font.medium.rawValue, size: 12))
                            .background(Color(hex: "9970ff"))
                            .foregroundColor(Color.white)
                            .multilineTextAlignment(.leading)
                            .cornerRadius(20)
                            .padding(.bottom, 66.7)
                        Spacer()
                    }
                }
                
                ZStack {
                    if viewModel.isShowPaymentDialog {
                        SodaDialog(
                            title: viewModel.paymentDialogTitle,
                            desc: viewModel.paymentDialogDesc,
                            confirmButtonTitle: viewModel.paymentDialogConfirmTitle,
                            confirmButtonAction: viewModel.paymentDialogConfirmAction,
                            cancelButtonTitle: viewModel.paymentDialogCancelTitle,
                            cancelButtonAction: viewModel.hidePaymentPopup
                        )
                    }
                    
                    if viewModel.isShowPasswordDialog {
                        LiveRoomPasswordDialog(
                            isShowing: $viewModel.isShowPasswordDialog,
                            can: viewModel.secretOrPasswordDialogCan,
                            confirmAction: viewModel.passwordDialogConfirmAction
                        )
                    }
                    
                    if viewModel.isShowCheersReportMenu {
                        VStack(spacing: 0) {
                            CheersReportMenuView(
                                isShowing: $viewModel.isShowCheersReportMenu,
                                onClickReport: { viewModel.isShowCheersReportView = true }
                            )
                            
                            if proxy.safeAreaInsets.bottom > 0 {
                                Rectangle()
                                    .foregroundColor(Color(hex: "222222"))
                                    .frame(width: proxy.size.width, height: 15.3)
                            }
                        }
                        .ignoresSafeArea()
                    }
                    
                    if viewModel.isShowCheersReportView {
                        CheersReportDialogView(
                            isShowing: $viewModel.isShowCheersReportView,
                            confirmAction: { reason in
                                viewModel.report(type: .CHEERS, reason: reason)
                            }
                        )
                    }
                    
                    if let creatorProfile = viewModel.creatorProfile, viewModel.isShowReportMenu {
                        VStack(spacing: 0) {
                            ProfileReportMenuView(
                                isShowing: $viewModel.isShowReportMenu,
                                isBlockedUser: creatorProfile.isBlock,
                                userBlockAction: { viewModel.isShowUesrBlockConfirm = true },
                                userUnBlockAction: { viewModel.userUnBlock(userId: userId) },
                                userReportAction: { viewModel.isShowUesrReportView = true },
                                profileReportAction: { viewModel.isShowProfileReportConfirm = true }
                            )
                            
                            if proxy.safeAreaInsets.bottom > 0 {
                                Rectangle()
                                    .foregroundColor(Color(hex: "222222"))
                                    .frame(width: proxy.size.width, height: 15.3)
                            }
                        }
                        .ignoresSafeArea()
                    }
                    
                    if let creatorProfile = viewModel.creatorProfile,
                       viewModel.isShowUesrBlockConfirm {
                        UserBlockConfirmDialogView(
                            isShowing: $viewModel.isShowUesrBlockConfirm,
                            nickname: creatorProfile.creator.nickname,
                            confirmAction: { viewModel.userBlock(userId: userId) }
                        )
                    }
                    
                    if viewModel.isShowUesrReportView {
                        UserReportDialogView(
                            isShowing: $viewModel.isShowUesrReportView,
                            confirmAction: { reason in
                                viewModel.report(type: .USER, userId: userId, reason: reason)
                            }
                        )
                    }
                    
                    if viewModel.isShowProfileReportConfirm {
                        ProfileReportDialogView(
                            isShowing: $viewModel.isShowProfileReportConfirm,
                            confirmAction: {
                                viewModel.report(type: .PROFILE, userId: userId)
                            }
                        )
                    }
                }
            }
            .sheet(
                isPresented: $viewModel.isShowShareView,
                onDismiss: { viewModel.shareMessage = "" },
                content: {
                    ActivityViewController(activityItems: [viewModel.shareMessage])
                }
            )
            .onAppear {
                viewModel.getCreatorProfile(userId: userId)
                AppState.shared.pushChannelId = 0
            }
        }
    }
}

struct UserProfileView_Previews: PreviewProvider {
    static var previews: some View {
        UserProfileView(userId: 0)
    }
}