//
//  MapKit+E.swift
//  Pods
//
//  Created by Groot on 2025/5/14.
//

import MapKit
import Foundation

extension MKMapView {
    // 按比例 按padding适应annotation
    public func fitsAllPoints(
        points: [MKMapPoint],
        padding: UIEdgeInsets,
        aspectRatio: Double? = nil,
        animated: Bool = true
    ) {
        var zoomRect: MKMapRect = .null
        for point in points {
            let pointRect = MKMapRect(x: point.x, y: point.y, width: 0, height: 0)
            if zoomRect.isNull {
                zoomRect = pointRect
            } else {
                zoomRect = zoomRect.union(pointRect)
            }
        }

        // Calculate the desired size based on the aspect ratio
        let aspectRatio = aspectRatio ?? 1.0
        let width = zoomRect.size.width
        let height = zoomRect.size.height
        let desiredWidth = max(width, height * aspectRatio)
        let desiredHeight = max(height, width / aspectRatio)

        // Calculate the center of the annotations
        let center = MKMapPoint(x: zoomRect.midX, y: zoomRect.midY)

        // Create a new MKMapRect with the desired aspect ratio and centered on the annotations
        let newMapRect = MKMapRect(
            x: center.x - desiredWidth / 2,
            y: center.y - desiredHeight / 2,
            width: desiredWidth,
            height: desiredHeight
        )
        setVisibleMapRect(newMapRect, edgePadding: padding, animated: animated)
    }

    func calculateMapRect(points: [MKMapPoint], padding: UIEdgeInsets = .zero) -> MKMapRect {
        var zoomRect: MKMapRect = .null
        for point in points {
            let pointRect = MKMapRect(x: point.x, y: point.y, width: 0, height: 0)
            if zoomRect.isNull {
                zoomRect = pointRect
            } else {
                zoomRect = zoomRect.union(pointRect)
            }
        }
        return mapRectThatFits(zoomRect, edgePadding: padding)
    }

    func takeSnapShot(option: MKMapSnapshotter.Options, completion: @escaping (MKMapSnapshotter.Snapshot?) -> Void) {
        let shotter = MKMapSnapshotter(options: option)
        shotter.start(with: .global()) { shot, _ in
            completion(shot)
        }
    }
}
