//
//  ChatView.swift
//  forShip
//
//  Created by Mamoru Sugita on 2023/10/16.
//

import SwiftUI

struct ChatView: View {
    @EnvironmentObject private var selectedTabModel: SelectedTabModel
    @ObservedObject var message = SharingData.message
    @State var isShowMember: Bool = false
    @State var isNotification = Preferences.ChatNotification
    @State var isFocus: Bool = true

    var body: some View {
        ZStack {
            if message.mode == true{
                LinearGradient(gradient: Gradient(colors: [.chatEmargencyColor1,  .chatEmargencyColor2]), startPoint: .top, endPoint: .bottom)
                    .ignoresSafeArea()
            }
            VStack(spacing: 0){
                ChatTitleView(isShowMember: $isShowMember, isNotification: $isNotification)

                ZStack{
                    ScrollViewReader { proxy in
                        ScrollView(.vertical) {
                            VStack {
                                Spacer()
                                    .frame(height: 20)

                                ForEach(message.messages, id: \.messageId) { msg in
                                    if msg.from == Preferences.UserName {
                                        //自分のメッセージ
                                        MyChatContentView(message: msg)
                                            .padding(.bottom, 24)
                                    }else{
                                        //他人のメッセージ
                                        OtherChatContentView(message: msg)
                                            .padding(.bottom, 24)
                                    }
                                }
                            }
                            .onAppear {
                                if let id = message.messages.last?.messageId {
                                    print(debug: "ChatView:onAppear")
                                    proxy.scrollTo(id, anchor: .bottom)
                                }
                            }
                            .onChange(of: message.messages.count) { newValue in
                                withAnimation {
                                    if let id = message.messages.last?.messageId {
                                        print(debug: "ChatView:onChange")
                                        proxy.scrollTo(id, anchor: .bottom)
                                    }
                                }
                            }
                            .onReceive(message.$messages) { (value) in
                                withAnimation {
                                    guard !value.isEmpty else {return}
                                    if let id = message.messages.last?.messageId {
                                        print(debug: "ChatView:onReceive")
                                        proxy.scrollTo(id, anchor: .bottom)
                                    }
                                }
                            }
                        }
                    }
                    HStack {
                        Spacer()
                        VStack{
                            Button{
                                selectedTabModel.isShowChangeEmrMode.toggle()
                                isFocus = false
                            }label: {
                                Image(systemName: "exclamationmark.triangle.fill")
                                    .foregroundColor(.white)
                                    .frame(width: 48, height: 48)
                                    .background(ColorSet.Notice.color)
                                    .cornerRadius(50)
                            }.padding(9)
                            Spacer()
                        }
                    }
                    if isShowMember{
                        ChatMemberView()
                    }
                }
                .onTapGesture {
                    isFocus = false
                }
                ChatInputView(isFocus: $isFocus)
            }
        }
        .background(ColorSet.BackgroundPrimary.color)
    }
}

#Preview {
    ChatView()
}

