import Repeat
import SwiftUI

struct SearchTextField: View {
    private var navigation = NavigationModel.shared
    @ObservedObject private var state = SearchModel.shared

    var body: some View {
        ZStack {
            #if os(macOS)
                fieldBorder
            #endif

            HStack(spacing: 0) {
                #if os(macOS)
                    Image(systemName: "magnifyingglass")
                        .resizable()
                        .aspectRatio(contentMode: .fill)
                        .frame(width: 12, height: 12)
                        .padding(.horizontal, 8)
                        .opacity(0.8)
                #endif
                TextField("Search...", text: $state.queryText) {
                    state.changeQuery { query in
                        query.query = state.queryText
                        navigation.hideKeyboard()
                    }
                    RecentsModel.shared.addQuery(state.queryText)
                }
                .disableAutocorrection(true)
                #if os(macOS)
                    .frame(maxWidth: 190)
                    .textFieldStyle(.plain)
                #else
                    .frame(minWidth: 200)
                    .textFieldStyle(.roundedBorder)
                    .padding(.horizontal, 5)
                    .padding(.trailing, state.queryText.isEmpty ? 0 : 10)
                #endif

                if !state.queryText.isEmpty {
                    clearButton
                } else {
                    #if os(macOS)
                        clearButton
                            .opacity(0)
                    #endif
                }
            }
        }
        .transaction { t in t.animation = nil }
    }

    private var fieldBorder: some View {
        RoundedRectangle(cornerRadius: 5, style: .continuous)
            .fill(Color.background)
            .frame(width: 250, height: 32)
            .overlay(
                RoundedRectangle(cornerRadius: 5, style: .continuous)
                    .stroke(Color.gray.opacity(0.4), lineWidth: 1)
                    .frame(width: 250, height: 31)
            )
    }

    private var clearButton: some View {
        Button(action: {
            self.state.queryText = ""
        }) {
            Image(systemName: "xmark.circle.fill")
            #if os(macOS)
                .imageScale(.small)
            #else
                .imageScale(.medium)
            #endif
        }
        .buttonStyle(PlainButtonStyle())
        #if os(macOS)
            .padding(.trailing, 10)
        #endif
            .opacity(0.7)
    }
}