//! Estruturas de respostas da API

use super::*;
use serde::{Deserialize, Serialize};

/// Resposta da análise de pedido
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct OrderAnalysisResponse {
    /// ID do pedido
    pub id: String,

    /// Recomendação da análise
    pub recommendation: Recommendation,

    /// Score de risco (0-100)
    pub score: f64,

    /// Status do pedido
    #[serde(skip_serializing_if = "Option::is_none")]
    pub status: Option<OrderStatus>,

    /// Tipo de análise realizada
    // #[serde(skip_serializing_if = "Option::is_none")]
    // pub analysis: Option<AnalysisType>,

    /// Dispositivo reconhecido
    #[serde(skip_serializing_if = "Option::is_none")]
    pub device: Option<DeviceInfo>,

    /// Navegação reconhecida
    #[serde(skip_serializing_if = "Option::is_none")]
    pub navigation: Option<NavigationInfo>,

    /// Geolocalização
    #[serde(skip_serializing_if = "Option::is_none")]
    pub geolocation: Option<GeolocationInfo>,

    /// Lista de warnings/alertas
    #[serde(skip_serializing_if = "Option::is_none")]
    pub warnings: Option<Vec<String>>,
}

/// Informações do dispositivo na resposta
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DeviceInfo {
    /// ID do dispositivo
    pub id: String,

    /// Se o dispositivo é confiável
    #[serde(skip_serializing_if = "Option::is_none")]
    pub is_trusted: Option<bool>,

    /// Número de pedidos feitos com este dispositivo
    #[serde(skip_serializing_if = "Option::is_none")]
    pub orders_count: Option<i32>,
}

/// Informações de navegação na resposta
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct NavigationInfo {
    /// Tempo de navegação em segundos
    #[serde(skip_serializing_if = "Option::is_none")]
    pub time: Option<i32>,

    /// Número de páginas visitadas
    #[serde(skip_serializing_if = "Option::is_none")]
    pub page_count: Option<i32>,
}

/// Informações de geolocalização na resposta
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GeolocationInfo {
    /// País
    #[serde(skip_serializing_if = "Option::is_none")]
    pub country: Option<String>,

    /// Região/Estado
    #[serde(skip_serializing_if = "Option::is_none")]
    pub region: Option<String>,

    /// Cidade
    #[serde(skip_serializing_if = "Option::is_none")]
    pub city: Option<String>,
}

/// Resposta ao consultar um pedido
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct OrderQueryResponse {
    /// ID do pedido
    pub id: String,

    /// Recomendação da análise
    pub recommendation: Recommendation,

    /// Score de risco
    pub score: f64,

    /// Status do pedido
    pub status: OrderStatus,

    // /// Tipo de análise
    // pub analysis: AnalysisType,
    /// Dados completos do pedido
    #[serde(flatten)]
    pub order_data: serde_json::Value,
}

/// Resposta ao atualizar status de pedido
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UpdateStatusResponse {
    /// ID do pedido
    pub id: String,

    /// Novo status
    pub status: OrderStatus,

    /// Mensagem de confirmação
    #[serde(skip_serializing_if = "Option::is_none")]
    pub message: Option<String>,
}

/// Resposta de erro da API
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ApiErrorResponse {
    /// Código do erro
    #[serde(skip_serializing_if = "Option::is_none")]
    pub code: Option<String>,

    /// Mensagem de erro
    pub message: String,

    /// Detalhes adicionais
    #[serde(skip_serializing_if = "Option::is_none")]
    pub details: Option<serde_json::Value>,
}
