//
//  ScenicSelectionLocationProvider.swift
//  suixinkan
//
//  Created by Codex on 2026/6/23.
//

import CoreLocation
import Foundation

/// 景区选择定位服务，负责向系统请求一次当前位置。
final class ScenicSelectionLocationProvider: NSObject, CLLocationManagerDelegate {
    var onLocation: ((CLLocation) -> Void)?
    var onFailure: ((String) -> Void)?

    private let manager = CLLocationManager()

    /// 初始化定位服务并配置精度。
    override init() {
        super.init()
        manager.delegate = self
        manager.desiredAccuracy = kCLLocationAccuracyHundredMeters
    }

    /// 请求一次当前位置；未授权时先触发系统授权弹窗。
    func request() {
        switch manager.authorizationStatus {
        case .notDetermined:
            manager.requestWhenInUseAuthorization()
        case .authorizedAlways, .authorizedWhenInUse:
            manager.requestLocation()
        case .denied, .restricted:
            onFailure?("定位权限未开启，请在系统设置中允许访问位置")
        @unknown default:
            onFailure?("定位状态不可用")
        }
    }

    /// 监听授权状态变化，并在授权后继续请求定位。
    func locationManagerDidChangeAuthorization(_ manager: CLLocationManager) {
        switch manager.authorizationStatus {
        case .authorizedAlways, .authorizedWhenInUse:
            manager.requestLocation()
        case .denied, .restricted:
            onFailure?("定位权限未开启，请在系统设置中允许访问位置")
        default:
            break
        }
    }

    /// 接收系统返回的位置。
    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        if let location = locations.last {
            onLocation?(location)
        }
    }

    /// 接收系统定位错误。
    func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
        onFailure?("定位失败：\(error.localizedDescription)")
    }
}
