import Foundation
import SwiftUI

struct DropFavorite: DropDelegate {
    let item: FavoriteItem
    @Binding var favorites: [FavoriteItem]
    @Binding var current: FavoriteItem?

    func dropEntered(info _: DropInfo) {
        guard item != current else {
            return
        }

        guard let current else {
            return
        }

        let from = favorites.firstIndex(of: current)
        let to = favorites.firstIndex(of: item)

        guard let from, let to else {
            return
        }

        guard favorites[to].id != current.id else {
            return
        }

        favorites.move(
            fromOffsets: IndexSet(integer: from),
            toOffset: to > from ? to + 1 : to
        )
    }

    func dropUpdated(info _: DropInfo) -> DropProposal? {
        DropProposal(operation: .move)
    }

    func performDrop(info _: DropInfo) -> Bool {
        current = nil
        return true
    }
}