import Foundation

enum Authz {
    static func has(_ user: AuthedUserDto, _ perm: String) -> Bool {
        user.permissions?.contains(perm) == true
    }

    static func isDriver(_ role: String?) -> Bool { role == "driver" }
    static func isParent(_ role: String?) -> Bool { role == "parent" }
    static func isStudent(_ role: String?) -> Bool { role == "student" }
    static func isSchoolStaff(_ role: String?) -> Bool { role == "school" || role == "school_operator" }
    static func isGovernmentViewer(_ role: String?) -> Bool { role == "government_viewer" }
    static func isGovernmentOperator(_ role: String?) -> Bool {
        role == "government_operator" || role == "government"
    }

    static func showUsersNav(_ user: AuthedUserDto) -> Bool {
        !isGovernmentViewer(user.role) &&
            (has(user, "users_update") || has(user, "users_create") || has(user, "users_delete"))
    }

    static func showSchoolsNav(_ user: AuthedUserDto) -> Bool {
        has(user, "schools_read") &&
            (!isGovernmentViewer(user.role)
                ? (has(user, "schools_update") || has(user, "schools_create"))
                : has(user, "map_global_view"))
    }

    static func showFleetNav(_ user: AuthedUserDto) -> Bool {
        !isGovernmentViewer(user.role) && has(user, "fleet_read")
    }

    static func showSupportDesk(_ user: AuthedUserDto) -> Bool {
        has(user, "feedback_support_agent") && has(user, "feedback_support_read_all")
    }

    static func showIdeasNav() -> Bool { true }
    static func showHelpNav() -> Bool { true }

    static let allPermissions: [String] = [
        "users_read", "users_create", "users_create_school", "users_update", "users_delete",
        "schools_read", "schools_create", "schools_update", "schools_delete",
        "students_read", "students_update", "students_approve", "students_enroll_own",
        "students_enroll_school", "students_reassign_school", "parents_read", "parents_update",
        "fleet_read", "fleet_create", "fleet_update", "fleet_delete", "vehicles_assign_school",
        "trackers_manage", "routes_regenerate", "map_global_view", "audit_logs_read",
        "feedback_support_create", "feedback_feature_create", "feedback_vote",
        "feedback_support_read_all", "feedback_support_agent", "feedback_support_macros_manage",
        "feedback_kb_admin", "feedback_feature_merge", "feedback_github_sync", "wallet_payout_review",
    ]

    static let manageableRoles: [String] = [
        "government", "government_operator", "government_viewer", "school", "school_operator",
        "fleet_operator", "parent", "driver",
    ]
}
