import Foundation

struct LoginRequest: Encodable {
    let login: String
    let password: String
    let company_number: String
    let device_name: String
}

struct LoginResponse: Decodable {
    let token: String?
    let profile: ProfileResponse?
    let message: String?
    let code: String?
    let challenge_id: String?
}

struct TwoFactorVerifyRequest: Encodable {
    let challenge_id: String
    let code: String
    let device_name: String
}

struct TwoFactorResendRequest: Encodable {
    let challenge_id: String
}

struct PushTokenRequest: Encodable {
    let platform: String
    let token: String
}

struct ProfileResponse: Decodable {
    let user: UserSummary
    let company: CompanySummary?
    let permissions: Permissions
    let branding: BrandingPayload?
}

struct UserSummary: Decodable {
    let id: Int
    let name: String
    let email: String
    let username: String?
    let role: String
    let department_id: Int?
}

struct CompanySummary: Decodable {
    let id: Int
    let name: String
    let slug: String
    let company_number: String?
    let status: String?
}

struct Permissions: Codable {
    let pages: [String]
    let actions: [String]
}

struct BrandingPayload: Decodable {
    let enabled: Bool
    let app_name: String?
    let logo_url: String?
}

struct StatsResponse: Decodable {
    let total_messages: Int?
    let today_messages: Int?
    let failed_syncs: Int?
    let active_devices: Int?
    let unread_alerts: Int?
}

struct MessageRow: Decodable, Identifiable {
    let id: Int
    let sender: String?
    let message_type: String?
    let received_at: String?
    let sync_status: String?
    let device: DeviceSummary?
}

struct DeviceSummary: Decodable {
    let id: Int
    let device_uid: String?
    let device_name: String?
    let user: UserDeviceSummary?
}

struct UserDeviceSummary: Decodable {
    let id: Int
    let name: String?
}

struct MessageDetail: Decodable {
    let id: Int
    let sender: String?
    let message_type: String?
    let received_at: String?
    let sync_status: String?
    let message: String?
    let message_redacted: Bool?
    let device: DeviceSummary?
}

struct PaginatedMessages: Decodable {
    let data: [MessageRow]
    let current_page: Int?
    let last_page: Int?
    let total: Int?
}

struct AlertItem: Decodable, Identifiable {
    let id: Int
    let type: String?
    let is_read: Bool?
    let message_id: Int?
    let expires_at: String?
    let message: MessageRow?
}

struct ApiErrorBody: Decodable {
    let message: String?
    let code: String?
}

enum ViewerError: LocalizedError {
    case invalidResponse
    case server(String)
    case maintenance(String)
    case unauthorized

    var errorDescription: String? {
        switch self {
        case .invalidResponse: return "Unexpected server response."
        case .server(let m): return m
        case .maintenance(let m): return m
        case .unauthorized: return "Session expired. Please sign in again."
        }
    }

    var isMaintenance: Bool {
        if case .maintenance = self { return true }
        return false
    }
}
