﻿syntax = "proto3";


import "google/protobuf/timestamp.proto";
package exchangeMail;
option csharp_namespace = "EmailMicroservice.Protos";

message EmailAttachment {
    string filename = 1;
    bytes content = 2; // contenido del archivo en formato binario
    string mime_type = 3; // Tipo de archivo (ej. "image/jpeg", "application/pdf")
    string content_id = 4; // Implementación futura. Para adjuntos inline (ej. imágenes embebidas en HTML)
    bool is_inline = 5;    // Implementación futura. Indica si es un adjunto inline
}

// Define un mensaje para un correo completo
message EmailMessage {
    string from = 1;
    repeated string to = 2; // La palabra 'repeated' indica una lista
    repeated string cc = 3; // Lista de destinatarios en copia
    string subject = 4;
    string body = 5; // El cuerpo del mensaje (texto plano o HTML)
    repeated EmailAttachment attachments = 6; // Lista de adjuntos
     string id = 7; //Identificador del correo
}

// Define el mensaje de solicitud para enviar un correo
message SendMailRequest {
    EmailMessage email = 1; // Un objeto EmailMessage con los datos a enviar
}

// Define el mensaje de respuesta después de enviar un correo
message SendMailResponse {
    bool success = 1; // 'true' si el envío fue exitoso, 'false' si hubo un error
    string message = 2; // Mensaje de éxito o de error
}

// Define el mensaje de solicitud para leer la bandeja de entrada
message ReadInboxRequest {
    int32 max_results = 1; // Número máximo de correos a devolver
    google.protobuf.Timestamp start_date = 2; // Filtro de fecha de inicio
    google.protobuf.Timestamp end_date = 3; // Filtro de fecha de fin
    string filter_from = 4; // Filtro por remitente
    string filter_subject = 5; // Filtro por asunto
    bool unread_only = 6; // Si solo se deben buscar correos no leídos
    bool include_attachments = 7; // Indicar si el filtro debe incluir archivos adjuntos
}

// Define el mensaje de respuesta para la lectura de la bandeja de entrada
message ReadInboxResponse {
    repeated EmailMessage emails = 1; // Lista de correos encontrados
    int32 total_count = 2; // Cantidad total de correos en la bandeja de entrada
}

message GetItemDetailsRequest {
  string item_id = 1;
}

message GetItemDetailsResponse {
  EmailMessage email = 1;
}

// Define el servicio de gRPC que contendrá los métodos
service ExchangeMailService {
    // Método para enviar un correo
    rpc SendMail(SendMailRequest) returns (SendMailResponse);
    
    // Método para leer la bandeja de entrada
    rpc ReadInbox(ReadInboxRequest) returns (ReadInboxResponse);

    rpc GetItemDetails(GetItemDetailsRequest) returns (GetItemDetailsResponse);
}