//
//  SideMenuView.swift
//  uSTADIUM
//
//  Created by Omar Hegazy on 6/13/24.
//  Copyright © 2024 uSTADIUM. All rights reserved.
//

import SwiftUI

struct SideMenuView: View {
    @ObservedObject var viewModel: SideMenuViewModel
    
    var body: some View {
        NavigationStack {
            ZStack {
                Color.containerBackground
                    .edgesIgnoringSafeArea(.all)
                ScrollView {
                    VStack(alignment: .leading, spacing: 16) {
                        // User profile section
                        if let user = viewModel.user {
                            HStack(spacing: 12) {
                                ProfileImageView(url: user.getProfileImageURL())
                                    .frame(width: 50, height: 50)
                                    .clipShape(Circle())
                                VStack(alignment: .leading, spacing: 4) {
                                    Text(user.nickname)
                                        .font(.headline)
                                    user.attributedFullAt()
                                        .font(.subheadline)
                                        .foregroundColor(.gray)
                                }
                                Spacer()
                            }
                            .padding(.horizontal)
                            .padding(.vertical, 8)
                            .background(Color.containerBackground)
                            .cornerRadius(8)
                            .padding(.horizontal)
                        }
                        
                        // MARK: - Side Menu Sections
                        VStack(alignment: .leading, spacing: 8) {
                            SideMenuSection(header: "PROFILE", options: viewModel.profileOptions, onTap: viewModel.handleProfileOptionTap)
                            SideMenuSection(header: "COOL STUFF", options: viewModel.coolStuffOptions, onTap: viewModel.handleCoolStuffOptionTap)
                            if viewModel.isAdmin {
                                SideMenuSection(header: "ADMIN", options: viewModel.adminOptions, onTap: viewModel.handleAdminOptionTap)
                            }
                        }
                        .padding(.horizontal)
                    }
                }
            }
        }
        .onAppear {
            viewModel.navigateTo = { vc in
                if let rootVC = UIApplication.shared.windows.first?.rootViewController {
                    rootVC.dismiss(animated: true) {
                        if let navVC = rootVC as? UINavigationController {
                            navVC.pushViewController(vc, animated: true)
                        } else {
                            rootVC.present(vc, animated: true, completion: nil)
                        }
                    }
                }
            }
        }
    }
}

struct SideMenuSection: View {
    var header: String
    var options: [SideMenuOBJ]
    var onTap: (SideMenuOBJ) -> Void
    
    var body: some View {
        VStack(alignment: .leading, spacing: 4) {
            Text(header)
                .font(.headline)
                .padding(.leading)
                .padding(.top, 8)
            ForEach(options, id: \.label) { option in
                MenuOptionRow(option: option)
                    .onTapGesture {
                        onTap(option)
                        print("Option chosen: \(option.label)")
                    }
            }
        }
        .background(Color.containerBackground)
        .cornerRadius(8)
    }
}

struct MenuOptionRow: View {
    var option: SideMenuOBJ
    
    var body: some View {
        HStack {
            Image(uiImage: option.image)
                .renderingMode(.template)
                .foregroundColor(.primary)
                .frame(width: 24, height: 24)
            Text(option.label)
                .foregroundColor(.primary)
                .font(.body)
            Spacer()
        }
        .padding()
    }
}