syntax = "proto3";

package products;

import "public_messages.proto";
import "google/protobuf/empty.proto";
import "google/protobuf/wrappers.proto";
import "google/protobuf/duration.proto";  
import "google/protobuf/timestamp.proto";
import "google/api/annotations.proto";

option csharp_namespace = "CMSMicroservice.Protobuf.Protos.Products";

service ProductsContract
{
    rpc CreateNewProducts(CreateNewProductsRequest) returns (CreateNewProductsResponse){
        option (google.api.http) = {
            post: "/CreateNewProducts"
            body: "*"
        };
    };
    rpc UpdateProducts(UpdateProductsRequest) returns (google.protobuf.Empty){
        option (google.api.http) = {
            put: "/UpdateProducts"
            body: "*"
        };
    };
    rpc DeleteProducts(DeleteProductsRequest) returns (google.protobuf.Empty){
        option (google.api.http) = {
            delete: "/DeleteProducts"
            body: "*"
        };
    };
    rpc GetProducts(GetProductsRequest) returns (GetProductsResponse){
        option (google.api.http) = {
            get: "/GetProducts"
            
        };
    };
    rpc GetAllProductsByFilter(GetAllProductsByFilterRequest) returns (GetAllProductsByFilterResponse){
        option (google.api.http) = {
            get: "/GetAllProductsByFilter"
            
        };
    };
    rpc BulkUpdateProductPrices(BulkUpdateProductPricesRequest) returns (BulkUpdateProductPricesResponse){
        option (google.api.http) = {
            post: "/BulkUpdateProductPrices"
            body: "*"
        };
    };
    rpc BulkUpdateProductStock(BulkUpdateProductStockRequest) returns (BulkUpdateProductStockResponse){
        option (google.api.http) = {
            post: "/BulkUpdateProductStock"
            body: "*"
        };
    };
    rpc GetLowStockProducts(GetLowStockProductsRequest) returns (GetLowStockProductsResponse){
        option (google.api.http) = {
            get: "/GetLowStockProducts"
        };
    };
    rpc ToggleProductStatus(ToggleProductStatusRequest) returns (ToggleProductStatusResponse){
        option (google.api.http) = {
            post: "/ToggleProductStatus"
            body: "*"
        };
    };
    
    // ============= Customer-specific Methods =============
    
    rpc GetCustomerProducts(GetProductsRequest) returns (GetProductsResponse){
        option (google.api.http) = {
            get: "/Customer/GetProduct"
        };
    };
    rpc GetCustomerProductsByFilter(GetAllProductsByFilterRequest) returns (GetCustomerProductsByFilterResponse){
        option (google.api.http) = {
            get: "/Customer/GetProducts"
        };
    };
    
    // ============= Category-Product DragDrop Methods =============
    
    rpc GetProductsForCategory(GetProductsForCategoryRequest) returns (GetProductsForCategoryResponse){
        option (google.api.http) = {
            get: "/GetProductsForCategory"
        };
    };
    rpc GetCategories(GetCategoriesRequest) returns (GetCategoriesResponse){
        option (google.api.http) = {
            get: "/GetCategories"
        };
    };
    rpc UpdateProductCategories(UpdateProductCategoriesRequest) returns (google.protobuf.Empty){
        option (google.api.http) = {
            post: "/UpdateProductCategories"
            body: "*"
        };
    };
    rpc UpdateCategoryProducts(UpdateCategoryProductsRequest) returns (google.protobuf.Empty){
        option (google.api.http) = {
            post: "/UpdateCategoryProducts"
            body: "*"
        };
    };
    
    // ============= Product Image Management =============
    
    rpc AddProductImage(AddProductImageRequest) returns (AddProductImageResponse){
        option (google.api.http) = {
            post: "/AddProductImage"
            body: "*"
        };
    };
    rpc RemoveProductImage(RemoveProductImageRequest) returns (google.protobuf.Empty){
        option (google.api.http) = {
            delete: "/RemoveProductImage"
        };
    };
    rpc GetProductGallery(GetProductGalleryRequest) returns (GetProductGalleryResponse){
        option (google.api.http) = {
            get: "/GetProductGallery"
        };
    };
}
message CreateNewProductsRequest
{
    string title = 1;
    string description = 2;
    string short_infomation = 3;
    string full_information = 4;
    int64 price = 5;
    int32 discount = 6;
    int32 rate = 7;
    string image_path = 8;
    string thumbnail_path = 9;
    int32 sale_count = 10;
    int32 view_count = 11;
    int32 remaining_count = 12;
    // لیست شناسه دسته‌بندی‌های محصول
    repeated int64 category_ids = 13;
    // فایل تصویر اصلی محصول (آپلود باینری)
    ImageFileModel image_file = 14;
    // فایل تصویر بندانگشتی محصول (آپلود باینری)
    ImageFileModel thumbnail_file = 15;
}
message CreateNewProductsResponse
{
    int64 id = 1;
}
message UpdateProductsRequest
{
    int64 id = 1;
    string title = 2;
    string description = 3;
    string short_infomation = 4;
    string full_information = 5;
    int64 price = 6;
    int32 discount = 7;
    int32 rate = 8;
    string image_path = 9;
    string thumbnail_path = 10;
    int32 sale_count = 11;
    int32 view_count = 12;
    int32 remaining_count = 13;
    // لیست شناسه دسته‌بندی‌های محصول
    repeated int64 category_ids = 14;
    // فایل تصویر اصلی محصول (آپلود باینری)
    ImageFileModel image_file = 15;
    // فایل تصویر بندانگشتی محصول (آپلود باینری)
    ImageFileModel thumbnail_file = 16;
}
message DeleteProductsRequest
{
    int64 id = 1;
}
message GetProductsRequest
{
    int64 id = 1;
}
message GetProductsResponse
{
    int64 id = 1;
    string title = 2;
    string description = 3;
    string short_infomation = 4;
    string full_information = 5;
    int64 price = 6;
    int32 discount = 7;
    int32 rate = 8;
    string image_path = 9;
    string thumbnail_path = 10;
    int32 sale_count = 11;
    int32 view_count = 12;
    int32 remaining_count = 13;
    repeated ProductGalleryItem gallery = 14;
    repeated ProductCategoryPath categories = 15;
}

message ProductGalleryItem
{
    int64 product_gallery_id = 1;
    int64 product_image_id = 2;
    string title = 3;
    string image_path = 4;
    string image_thumbnail_path = 5;
}
message GetAllProductsByFilterRequest
{
    messages.PaginationState pagination_state = 1;
    google.protobuf.StringValue sort_by = 2;
    GetAllProductsByFilterFilter filter = 3;
}
message GetAllProductsByFilterFilter
{
    google.protobuf.Int64Value id = 1;
    google.protobuf.StringValue title = 2;
    google.protobuf.StringValue description = 3;
    google.protobuf.StringValue short_infomation = 4;
    google.protobuf.StringValue full_information = 5;
    google.protobuf.Int64Value price = 6;
    google.protobuf.Int32Value discount = 7;
    google.protobuf.Int32Value rate = 8;
    google.protobuf.StringValue image_path = 9;
    google.protobuf.StringValue thumbnail_path = 10;
    google.protobuf.Int32Value sale_count = 11;
    google.protobuf.Int32Value view_count = 12;
    google.protobuf.Int32Value remaining_count = 13;
    google.protobuf.Int64Value category_id = 14;
    google.protobuf.BoolValue is_active = 15;
    google.protobuf.BoolValue in_stock = 16;
}
message GetAllProductsByFilterResponse
{
    messages.MetaData meta_data = 1;
    repeated GetAllProductsByFilterResponseModel models = 2;
}
message GetAllProductsByFilterResponseModel
{
    int64 id = 1;
    string title = 2;
    string description = 3;
    string short_infomation = 4;
    string full_information = 5;
    int64 price = 6;
    int32 discount = 7;
    int32 rate = 8;
    string image_path = 9;
    string thumbnail_path = 10;
    int32 sale_count = 11;
    int32 view_count = 12;
    int32 remaining_count = 13;
    // لیست شناسه دسته‌بندی‌های محصول
    repeated int64 category_ids = 14;
    // وضعیت فعال/غیرفعال (معکوس IsDeleted)
    bool is_active = 15;
}

message GetCustomerProductsByFilterResponse
{
    messages.MetaData meta_data = 1;
    repeated GetCustomerProductsByFilterResponseModel models = 2;
}

message GetCustomerProductsByFilterResponseModel
{
    int64 id = 1;
    string title = 2;
    string description = 3;
    string short_infomation = 4;
    string full_information = 5;
    int64 price = 6;
    int32 discount = 7;
    int32 rate = 8;
    string image_path = 9;
    string thumbnail_path = 10;
    int32 sale_count = 11;
    int32 view_count = 12;
    int32 remaining_count = 13;
    repeated ProductCategoryPath categories = 14;
}

message ProductCategoryPath
{
    int64 category_id = 1;
    string title = 2;
    repeated CategoryNode path = 3;
}

message CategoryNode
{
    int64 id = 1;
    string title = 2;
    google.protobuf.Int64Value parent_id = 3;
}

// Bulk Update Product Prices
message BulkUpdateProductPricesRequest
{
    repeated ProductPriceUpdate products = 1;
}

message ProductPriceUpdate
{
    int64 product_id = 1;
    int64 new_price = 2;
    google.protobuf.Int32Value new_discount = 3;
    google.protobuf.Int32Value new_club_discount_percent = 4;
}

message BulkUpdateProductPricesResponse
{
    int32 total = 1;
    int32 succeeded = 2;
    int32 failed = 3;
    repeated BulkOperationError errors = 4;
}

message BulkOperationError
{
    int64 product_id = 1;
    string error_message = 2;
}

// Bulk Update Product Stock
message BulkUpdateProductStockRequest
{
    repeated ProductStockUpdate products = 1;
    StockUpdateType update_type = 2;
}

message ProductStockUpdate
{
    int64 product_id = 1;
    int32 quantity = 2;
}

enum StockUpdateType
{
    SET = 0;
    ADD = 1;
    SUBTRACT = 2;
}

message BulkUpdateProductStockResponse
{
    int32 total = 1;
    int32 succeeded = 2;
    int32 failed = 3;
    repeated BulkOperationError errors = 4;
}

// Get Low Stock Products
message GetLowStockProductsRequest
{
    int32 threshold = 1;
    int32 page_index = 2;
    int32 page_size = 3;
    google.protobuf.BoolValue is_club_exclusive = 4;
}

message GetLowStockProductsResponse
{
    messages.MetaData meta_data = 1;
    repeated LowStockProduct products = 2;
}

message LowStockProduct
{
    int64 id = 1;
    string title = 2;
    int32 remaining_count = 3;
    int64 price = 4;
    bool is_club_exclusive = 5;
}

// Toggle Product Status
message ToggleProductStatusRequest
{
    repeated int64 product_ids = 1;
    bool enable = 2;
    int32 default_stock = 3;
}

message ToggleProductStatusResponse
{
    int32 total = 1;
    int32 succeeded = 2;
    int32 failed = 3;
    repeated BulkOperationError errors = 4;
}

// Category Product Item (for drag-drop UI)
message CategoryProductItem
{
    int64 id = 1;
    string title = 2;
    bool selected = 3;
}

// Get Products for Category
message GetProductsForCategoryRequest
{
    int64 category_id = 1;
}

message GetProductsForCategoryResponse
{
    repeated CategoryProductItem items = 1;
}

// Category Item (for product categories drag-drop)
message CategoryItem
{
    int64 id = 1;
    string title = 2;
    bool selected = 3;
}

// Get Categories for Product
message GetCategoriesRequest
{
    int64 product_id = 1;
}

message GetCategoriesResponse
{
    repeated CategoryItem items = 1;
}

// Update Product Categories
message UpdateProductCategoriesRequest
{
    int64 product_id = 1;
    repeated int64 category_ids = 2;
}

// Update Category Products
message UpdateCategoryProductsRequest
{
    int64 category_id = 1;
    repeated int64 product_ids = 2;
}

// Image File Model
message ImageFileModel
{
    bytes file = 1;
    string mime = 2;
    string file_name = 3;
}

// Get Product Gallery
message GetProductGalleryRequest
{
    int64 product_id = 1;
}

message GetProductGalleryResponse
{
    repeated ProductGalleryItem items = 1;
}

// Add Product Image
message AddProductImageRequest
{
    int64 product_id = 1;
    string title = 2;
    ImageFileModel image_file = 3;
}

message AddProductImageResponse
{
    int64 product_gallery_id = 1;
    int64 product_image_id = 2;
    string title = 3;
    string image_path = 4;
    string image_thumbnail_path = 5;
}

// Remove Product Image
message RemoveProductImageRequest
{
    int64 product_gallery_id = 1;
}
