import XCTest

/// UI Tests for Portfolio Journal app
/// These tests verify the app's user interface and navigation flows
final class PortfolioJournalUITests: XCTestCase {

    var app: XCUIApplication!

    override func setUpWithError() throws {
        continueAfterFailure = false
        app = XCUIApplication()
        app.launchArguments = ["--uitesting"]
        app.launch()
    }

    override func tearDownWithError() throws {
        app = nil
    }

    // MARK: - App Launch Tests

    func testAppLaunches() throws {
        // Verify the app launches successfully
        XCTAssertTrue(app.exists)
    }

    func testTabBarExists() throws {
        // Wait for the tab bar to appear
        let tabBar = app.tabBars.firstMatch
        let exists = tabBar.waitForExistence(timeout: 5)
        XCTAssertTrue(exists, "Tab bar should exist after launch")
    }

    // MARK: - Navigation Tests

    func testDashboardTabIsSelected() throws {
        // Dashboard should be the default selected tab
        let tabBar = app.tabBars.firstMatch
        _ = tabBar.waitForExistence(timeout: 5)

        // Look for Dashboard tab button
        let dashboardTab = tabBar.buttons["Dashboard"]
        if dashboardTab.exists {
            XCTAssertTrue(dashboardTab.isSelected || dashboardTab.isHittable)
        }
    }

    func testNavigateToSourcesTab() throws {
        let tabBar = app.tabBars.firstMatch
        _ = tabBar.waitForExistence(timeout: 5)

        let sourcesTab = tabBar.buttons["Sources"]
        if sourcesTab.exists {
            sourcesTab.tap()
            // Verify we're on the Sources screen
            XCTAssertTrue(sourcesTab.isSelected || sourcesTab.isHittable)
        }
    }

    func testNavigateToGoalsTab() throws {
        let tabBar = app.tabBars.firstMatch
        _ = tabBar.waitForExistence(timeout: 5)

        let goalsTab = tabBar.buttons["Goals"]
        if goalsTab.exists {
            goalsTab.tap()
            XCTAssertTrue(goalsTab.isSelected || goalsTab.isHittable)
        }
    }

    func testNavigateToJournalTab() throws {
        let tabBar = app.tabBars.firstMatch
        _ = tabBar.waitForExistence(timeout: 5)

        let journalTab = tabBar.buttons["Journal"]
        if journalTab.exists {
            journalTab.tap()
            XCTAssertTrue(journalTab.isSelected || journalTab.isHittable)
        }
    }

    func testNavigateToSettingsTab() throws {
        let tabBar = app.tabBars.firstMatch
        _ = tabBar.waitForExistence(timeout: 5)

        let settingsTab = tabBar.buttons["Settings"]
        if settingsTab.exists {
            settingsTab.tap()
            XCTAssertTrue(settingsTab.isSelected || settingsTab.isHittable)
        }
    }

    // MARK: - All Tabs Navigation Test

    func testNavigateThroughAllTabs() throws {
        let tabBar = app.tabBars.firstMatch
        guard tabBar.waitForExistence(timeout: 5) else {
            XCTFail("Tab bar not found")
            return
        }

        let tabs = ["Dashboard", "Sources", "Goals", "Journal", "Settings"]

        for tabName in tabs {
            let tab = tabBar.buttons[tabName]
            if tab.exists && tab.isHittable {
                tab.tap()
                // Give time for navigation
                Thread.sleep(forTimeInterval: 0.3)
            }
        }

        // Return to Dashboard
        let dashboardTab = tabBar.buttons["Dashboard"]
        if dashboardTab.exists {
            dashboardTab.tap()
        }
    }
}
