//
// Copyright 2025 Element Creations Ltd.
// Copyright 2023-2025 New Vector Ltd.
//
// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial.
// Please see LICENSE files in the repository root for full details.
//

import CoreLocation
@testable import ElementX
import Testing

@Suite
struct MapTilerURLBuilderTests {
    private static let baseURL: URL = "http://www.foo.com"
    private static let apiKey = "some_key"
    private static let lightStyleID = "9bc819c8-e627-474a-a348-ec144fe3d810"
    private static let darkStyleID = "dea61faf-292b-4774-9660-58fcef89a7f3"
    
    var builder: MapTilerURLBuilderProtocol
    
    init() {
        builder = MapTilerConfiguration(baseURL: Self.baseURL,
                                        apiKey: Self.apiKey,
                                        lightStyleID: Self.lightStyleID,
                                        darkStyleID: Self.darkStyleID)
    }
    
    @Test
    func staticMapBuilder() {
        let url = builder.staticMapTileImageURL(for: .light,
                                                coordinates: .init(latitude: 1, longitude: 2),
                                                zoomLevel: 5,
                                                size: .init(width: 300, height: 200),
                                                attribution: .hidden)
        
        let expectedURL: URL = "http://www.foo.com/9bc819c8-e627-474a-a348-ec144fe3d810/static/2.000000,1.000000,5.000000/300x200@2x.png?key=some_key&attribution=false"
        #expect(url == expectedURL)
    }
    
    @Test
    func staticMapBuilderWithAttribution() {
        let url = builder.staticMapTileImageURL(for: .dark,
                                                coordinates: .init(latitude: 1, longitude: 2),
                                                zoomLevel: 5,
                                                size: .init(width: 300, height: 200),
                                                attribution: .topLeft)
        
        let expectedURL: URL = "http://www.foo.com/dea61faf-292b-4774-9660-58fcef89a7f3/static/2.000000,1.000000,5.000000/300x200@2x.png?key=some_key&attribution=topleft"
        #expect(url == expectedURL)
    }
    
    @Test
    func dynamicMapBuilder() {
        let url = builder.interactiveMapURL(for: .dark)
        let expectedURL: URL = "http://www.foo.com/dea61faf-292b-4774-9660-58fcef89a7f3/style.json?key=some_key"
        #expect(url == expectedURL)
    }
    
    @Test
    mutating func nilAPIKey() {
        let configuration = MapTilerConfiguration(baseURL: Self.baseURL,
                                                  apiKey: nil,
                                                  lightStyleID: Self.lightStyleID,
                                                  darkStyleID: Self.darkStyleID)
        #expect(!configuration.isEnabled)
        
        builder = configuration
        
        let staticMapURL = builder.staticMapTileImageURL(for: .dark,
                                                         coordinates: .init(latitude: 1, longitude: 2),
                                                         zoomLevel: 5,
                                                         size: .init(width: 300, height: 200),
                                                         attribution: .topLeft)
        #expect(staticMapURL == nil)
        
        let dynamicMapURL = builder.interactiveMapURL(for: .light)
        #expect(dynamicMapURL == nil)
    }
}
