/**
 * DailyNotificationTests.swift
 * Daily Notification Plugin for Capacitor
 *
 * Tests for the DailyNotification plugin
 */

import XCTest
@testable import DailyNotificationPlugin

class DailyNotificationTests: XCTestCase {
    var plugin: DailyNotificationPlugin!
    var powerManager: DailyNotificationPowerManager!
    var maintenanceWorker: DailyNotificationMaintenanceWorker!
    
    override func setUp() {
        super.setUp()
        plugin = DailyNotificationPlugin()
        powerManager = DailyNotificationPowerManager.shared
        maintenanceWorker = DailyNotificationMaintenanceWorker.shared
    }
    
    override func tearDown() {
        plugin = nil
        super.tearDown()
    }
    
    // MARK: - Power Management Tests
    
    func testBatteryStatus() {
        let status = powerManager.getBatteryStatus()
        
        XCTAssertNotNil(status["level"])
        XCTAssertNotNil(status["isCharging"])
        XCTAssertNotNil(status["lastCheck"])
        XCTAssertNotNil(status["powerState"])
    }
    
    func testPowerState() {
        let state = powerManager.getPowerState()
        
        XCTAssertNotNil(state["powerState"])
        XCTAssertNotNil(state["adaptiveScheduling"])
        XCTAssertNotNil(state["batteryLevel"])
        XCTAssertNotNil(state["isCharging"])
        XCTAssertNotNil(state["lastCheck"])
    }
    
    func testAdaptiveScheduling() {
        powerManager.setAdaptiveScheduling(true)
        let normalInterval = DailyNotificationConfig.SchedulingIntervals.normal
        let criticalInterval = DailyNotificationConfig.SchedulingIntervals.critical
        
        // Test with different battery levels
        let intervals = [
            (batteryLevel: 10, expectedInterval: criticalInterval),
            (batteryLevel: 20, expectedInterval: DailyNotificationConfig.SchedulingIntervals.low),
            (batteryLevel: 40, expectedInterval: DailyNotificationConfig.SchedulingIntervals.medium),
            (batteryLevel: 60, expectedInterval: normalInterval)
        ]
        
        for (level, expected) in intervals {
            // Simulate battery level
            UIDevice.current.setValue(level, forKey: "batteryLevel")
            
            let interval = powerManager.getSchedulingInterval()
            XCTAssertEqual(interval, expected, "Interval should be \(expected) for battery level \(level)")
        }
    }
    
    // MARK: - Maintenance Tests
    
    func testMaintenanceTasks() {
        // Test cleanup of old notifications
        let oldDate = Date().addingTimeInterval(-Double(DailyNotificationConfig.shared.retentionDays * 24 * 60 * 60 + 1))
        
        // Create a test notification
        let content = UNMutableNotificationContent()
        content.title = "Test Notification"
        content.body = "This is a test notification"
        
        let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 1, repeats: false)
        let request = UNNotificationRequest(
            identifier: "test-notification",
            content: content,
            trigger: trigger
        )
        
        let expectation = XCTestExpectation(description: "Cleanup old notifications")
        
        UNUserNotificationCenter.current().add(request) { error in
            XCTAssertNil(error)
            
            // Perform maintenance
            self.maintenanceWorker.performMaintenance()
            
            // Verify cleanup
            UNUserNotificationCenter.current().getDeliveredNotifications { notifications in
                let oldNotifications = notifications.filter { $0.date < oldDate }
                XCTAssertTrue(oldNotifications.isEmpty, "Old notifications should be cleaned up")
                expectation.fulfill()
            }
        }
        
        wait(for: [expectation], timeout: 5.0)
    }
    
    // MARK: - Configuration Tests
    
    func testConfiguration() {
        let config = DailyNotificationConfig.shared
        
        // Test default values
        XCTAssertEqual(config.maxNotificationsPerDay, 10)
        XCTAssertEqual(config.retentionDays, 7)
        XCTAssertTrue(config.loggingEnabled)
        XCTAssertTrue(config.adaptiveSchedulingEnabled)
        
        // Test validation
        XCTAssertThrowsError(try config.setMaxNotificationsPerDay(0))
        XCTAssertThrowsError(try config.setRetentionDays(0))
        
        // Test reset
        config.resetToDefaults()
        XCTAssertEqual(config.maxNotificationsPerDay, 10)
        XCTAssertEqual(config.retentionDays, 7)
        XCTAssertTrue(config.loggingEnabled)
        XCTAssertTrue(config.adaptiveSchedulingEnabled)
    }
    
    // MARK: - Constants Tests
    
    func testConstants() {
        // Test default values
        XCTAssertEqual(DailyNotificationConstants.defaultTitle, "Daily Notification")
        XCTAssertEqual(DailyNotificationConstants.defaultBody, "Your daily update is ready")
        
        // Test notification identifier prefix
        XCTAssertTrue(DailyNotificationConstants.notificationIdentifierPrefix.hasPrefix("daily-notification-"))
        
        // Test event name
        XCTAssertEqual(DailyNotificationConstants.eventName, "notification")
        
        // Test settings defaults
        XCTAssertTrue(DailyNotificationConstants.Settings.defaultSound)
        XCTAssertEqual(DailyNotificationConstants.Settings.defaultPriority, "default")
        XCTAssertEqual(DailyNotificationConstants.Settings.defaultRetryCount, 3)
        XCTAssertEqual(DailyNotificationConstants.Settings.defaultRetryInterval, 1000)
    }
} 