//
//  AutocompleteController.swift
//  ComposeUI
//
//  Created by Shadowfacts on 3/25/23.
//

import SwiftUI
import Combine

class AutocompleteController: ViewController {
    
    unowned let parent: ComposeController
    
    @Published var mode: Mode?
    
    init(parent: ComposeController) {
        self.parent = parent
        
        parent.$currentInput
            .compactMap { $0 }
            .flatMap { $0.autocompleteStatePublisher }
            .map {
                switch $0 {
                case .mention(_):
                    return Mode.mention
                case .emoji(_):
                    return Mode.emoji
                case .hashtag(_):
                    return Mode.hashtag
                case nil:
                    return nil
                }
            }
            .assign(to: &$mode)
    }
    
    var view: some View {
        AutocompleteView()
    }
    
    struct AutocompleteView: View {
        @EnvironmentObject private var parent: ComposeController
        @EnvironmentObject private var controller: AutocompleteController
        @Environment(\.colorScheme) private var colorScheme: ColorScheme
        
        var body: some View {
            if let mode = controller.mode {
                VStack(spacing: 0) {
                    Divider()
                    suggestionsView(mode: mode)
                }
                .background(backgroundColor)
            }
        }
        
        @ViewBuilder
        private func suggestionsView(mode: Mode) -> some View {
            switch mode {
            case .mention:
                ControllerView(controller: { AutocompleteMentionsController(composeController: parent) })
            case .emoji:
                ControllerView(controller: { AutocompleteEmojisController(composeController: parent) })
            case .hashtag:
                ControllerView(controller: { AutocompleteHashtagsController(composeController: parent) })
            }
        }
        
        private var backgroundColor: Color {
            Color(white: colorScheme == .light ? 0.98 : 0.15)
        }
        
        private var borderColor: Color {
            Color(white: colorScheme == .light ? 0.85 : 0.25)
        }
    }
    
    enum Mode {
        case mention
        case emoji
        case hashtag
    }
}
