syntax = "proto3";

package category;

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.Category";

service CategoryContract
{
    rpc CreateNewCategory(CreateNewCategoryRequest) returns (CreateNewCategoryResponse){
        option (google.api.http) = {
            post: "/CreateNewCategory"
            body: "*"
        };
    };
    rpc UpdateCategory(UpdateCategoryRequest) returns (google.protobuf.Empty){
        option (google.api.http) = {
            put: "/UpdateCategory"
            body: "*"
        };
    };
    rpc DeleteCategory(DeleteCategoryRequest) returns (google.protobuf.Empty){
        option (google.api.http) = {
            delete: "/DeleteCategory"
            body: "*"
        };
    };
    rpc GetCategory(GetCategoryRequest) returns (GetCategoryResponse){
        option (google.api.http) = {
            get: "/GetCategory"
            
        };
    };
    rpc GetAllCategoryByFilter(GetAllCategoryByFilterRequest) returns (GetAllCategoryByFilterResponse){
        option (google.api.http) = {
            get: "/GetAllCategoryByFilter"
            
        };
    };
    rpc GetAllCategoriesForCustomer(GetAllCategoriesForCustomerRequest) returns (GetAllCategoriesForCustomerResponse){
        option (google.api.http) = {
            get: "/Customer/Categories/GetAllCategories"
        };
    };
    rpc GetCategoryByIdForCustomer(GetCategoryByIdForCustomerRequest) returns (GetCategoryByIdForCustomerResponse){
        option (google.api.http) = {
            get: "/Customer/Categories/GetCategory/{id}"
        };
    };
    rpc GetAllCategories(GetAllCategoriesRequest) returns (GetAllCategoriesResponse){
        option (google.api.http) = {
            get: "/Customer/GetAllCategories"
            
        };
    };
}
message CreateNewCategoryRequest
{
    string name = 1;
    string title = 2;
    google.protobuf.StringValue description = 3;
    google.protobuf.StringValue image_path = 4;
    google.protobuf.Int64Value parent_id = 5;
    bool is_active = 6;
    int32 sort_order = 7;
}
message CreateNewCategoryResponse
{
    int64 id = 1;
}
message UpdateCategoryRequest
{
    int64 id = 1;
    string name = 2;
    string title = 3;
    google.protobuf.StringValue description = 4;
    google.protobuf.StringValue image_path = 5;
    google.protobuf.Int64Value parent_id = 6;
    bool is_active = 7;
    int32 sort_order = 8;
}
message DeleteCategoryRequest
{
    int64 id = 1;
}
message GetCategoryRequest
{
    int64 id = 1;
}
message GetCategoryResponse
{
    int64 id = 1;
    string name = 2;
    string title = 3;
    google.protobuf.StringValue description = 4;
    google.protobuf.StringValue image_path = 5;
    google.protobuf.Int64Value parent_id = 6;
    bool is_active = 7;
    int32 sort_order = 8;
}
message GetAllCategoryByFilterRequest
{
    messages.PaginationState pagination_state = 1;
    google.protobuf.StringValue sort_by = 2;
    GetAllCategoryByFilterFilter filter = 3;
}
message GetAllCategoryByFilterFilter
{
    google.protobuf.Int64Value id = 1;
    google.protobuf.StringValue name = 2;
    google.protobuf.StringValue title = 3;
    google.protobuf.StringValue description = 4;
    google.protobuf.StringValue image_path = 5;
    google.protobuf.Int64Value parent_id = 6;
    google.protobuf.BoolValue is_active = 7;
    google.protobuf.Int32Value sort_order = 8;
}
message GetAllCategoryByFilterResponse
{
    messages.MetaData meta_data = 1;
    repeated GetAllCategoryByFilterResponseModel models = 2;
}
message GetAllCategoryByFilterResponseModel
{
    int64 id = 1;
    string name = 2;
    string title = 3;
    google.protobuf.StringValue description = 4;
    google.protobuf.StringValue image_path = 5;
    google.protobuf.Int64Value parent_id = 6;
    bool is_active = 7;
    int32 sort_order = 8;
    // تعداد محصولات این دسته‌بندی
    int32 product_count = 9;
}
message GetAllCategoriesRequest {
    messages.PaginationState pagination_state = 1;
    google.protobuf.StringValue sort_by = 2;
    GetAllCategoryByFilterFilter filter = 3;
}
message GetAllCategoriesResponse {
    messages.MetaData meta_data = 1;
    repeated GetAllCategoryFilterResponseModel models = 2;
}
message GetAllCategoryFilterResponseModel {
    int64 id = 1;
    string name = 2;
    string title = 3;
    string description = 4;
    google.protobuf.StringValue image_path = 5;
    google.protobuf.Int64Value parent_id = 6;
    bool is_active = 7;
    int32 sort_order = 8;
}

// Customer Messages
message GetAllCategoriesForCustomerRequest {
    google.protobuf.Int64Value parent_id = 1;
    int32 page_number = 2;
    int32 page_size = 3;
}

message GetAllCategoriesForCustomerResponse {
    messages.MetaData meta_data = 1;
    repeated GetAllCategoryFilterResponseModel models = 2;
}

message GetCategoryByIdForCustomerRequest {
    int64 id = 1;
}

message GetCategoryByIdForCustomerResponse {
    GetAllCategoryFilterResponseModel category = 1;
}
