syntax = "proto3";

package content.v1;

service BannerService {
  rpc CreateBanner (CreateBannerRequest) returns (CreateBannerResponse);
  rpc GetBanners (GetBannersRequest) returns (GetBannersResponse);
  rpc UpdateBanner (UpdateBannerRequest) returns (UpdateBannerResponse);
  rpc DeleteBanner (DeleteBannerRequest) returns (DeleteBannerResponse);
  rpc ReorderBanners (ReorderBannersRequest) returns (ReorderBannersResponse);
}

service FaqService {
  rpc CreateFaqItem (CreateFaqItemRequest) returns (CreateFaqItemResponse);
  rpc GetFaqs (GetFaqsRequest) returns (GetFaqsResponse);
  rpc UpdateFaqItem (UpdateFaqItemRequest) returns (UpdateFaqItemResponse);
  rpc DeleteFaqItem (DeleteFaqItemRequest) returns (DeleteFaqItemResponse);
}

service PublicContentService {
  rpc GetPublicBanners (GetPublicBannersRequest) returns (GetPublicBannersResponse);
  rpc GetPublicFaqs (GetPublicFaqsRequest) returns (GetPublicFaqsResponse);
  rpc GetPublicFilials (GetPublicFilialsRequest) returns (GetPublicFilialsResponse);
  rpc GetPublicPartners (GetPublicPartnersRequest) returns (GetPublicPartnersResponse);
  rpc GetPublicBlogs (GetPublicBlogsRequest) returns (GetPublicBlogsResponse);
  rpc GetPublicDocuments (GetPublicDocumentsRequest) returns (GetPublicDocumentsResponse);
  rpc GetPublicDocument (GetPublicDocumentRequest) returns (GetPublicDocumentResponse);
  rpc GetPublicStories (GetPublicStoriesRequest) returns (GetPublicStoriesResponse);
}

service AboutService {
  rpc GetAbout (GetAboutRequest) returns (GetAboutResponse);
  rpc UpsertAbout (UpsertAboutRequest) returns (UpsertAboutResponse);
}

service FilialService {
  rpc CreateFilial (CreateFilialRequest) returns (CreateFilialResponse);
  rpc GetFilials (GetFilialsRequest) returns (GetFilialsResponse);
  rpc UpdateFilial (UpdateFilialRequest) returns (UpdateFilialResponse);
  rpc DeleteFilial (DeleteFilialRequest) returns (DeleteFilialResponse);
  rpc ReorderFilials (ReorderFilialsRequest) returns (ReorderFilialsResponse);
}

service PartnerService {
  rpc CreatePartner (CreatePartnerRequest) returns (CreatePartnerResponse);
  rpc GetPartners (GetPartnersRequest) returns (GetPartnersResponse);
  rpc UpdatePartner (UpdatePartnerRequest) returns (UpdatePartnerResponse);
  rpc DeletePartner (DeletePartnerRequest) returns (DeletePartnerResponse);
  rpc ReorderPartners (ReorderPartnersRequest) returns (ReorderPartnersResponse);
}

service BlogService {
  rpc CreateBlog (CreateBlogRequest) returns (CreateBlogResponse);
  rpc GetBlogs (GetBlogsRequest) returns (GetBlogsResponse);
  rpc UpdateBlog (UpdateBlogRequest) returns (UpdateBlogResponse);
  rpc DeleteBlog (DeleteBlogRequest) returns (DeleteBlogResponse);
  rpc ReorderBlogs (ReorderBlogsRequest) returns (ReorderBlogsResponse);
}

service DocumentService {
  rpc CreateDocument (CreateDocumentRequest) returns (CreateDocumentResponse);
  rpc GetDocuments (GetDocumentsRequest) returns (GetDocumentsResponse);
  rpc GetDocument (GetDocumentRequest) returns (GetDocumentResponse);
  rpc UpdateDocument (UpdateDocumentRequest) returns (UpdateDocumentResponse);
  rpc DeleteDocument (DeleteDocumentRequest) returns (DeleteDocumentResponse);
}

service StoryService {
  rpc CreateStory (CreateStoryRequest) returns (CreateStoryResponse);
  rpc GetStories (GetStoriesRequest) returns (GetStoriesResponse);
  rpc UpdateStory (UpdateStoryRequest) returns (UpdateStoryResponse);
  rpc DeleteStory (DeleteStoryRequest) returns (DeleteStoryResponse);
  rpc ReorderStories (ReorderStoriesRequest) returns (ReorderStoriesResponse);
}

service MipifAutoReplyService {
  rpc ListMipifAutoReplyUsers (ListMipifAutoReplyUsersRequest) returns (ListMipifAutoReplyUsersResponse);
  rpc SendMipifWinnerMessages (SendMipifWinnerMessagesRequest) returns (SendMipifWinnerMessagesResponse);
}

// --- PUBLIC CONTENT MESSAGES ---
message GetPublicBannersRequest {}

message GetPublicBannersResponse {
  repeated Banner banners = 1;
}

message GetPublicFaqsRequest {}

message GetPublicFaqsResponse {
  repeated FaqItem faqs = 1;
}

message GetPublicBlogsRequest {}

message GetPublicBlogsResponse {
  repeated Blog blogs = 1;
}

message GetPublicDocumentsRequest {}

message GetPublicDocumentsResponse {
  repeated Document documents = 1;
}

message GetPublicDocumentRequest {
  string slug = 1;
}

message GetPublicDocumentResponse {
  Document document = 1;
}

message GetPublicStoriesRequest {}

message GetPublicStoriesResponse {
  repeated Story stories = 1;
}

// --- BANNER MESSAGES ---

message CreateBannerRequest {
  string image_url = 1;
  int32 order = 2;
  optional string link = 3;
}

message CreateBannerResponse {
  Banner banner = 1;
}

message GetBannersRequest {}

message GetBannersResponse {
  repeated Banner banners = 1;
}

message UpdateBannerRequest {
  Banner banner = 1;
}

message UpdateBannerResponse {
  Banner banner = 1;
}

message DeleteBannerRequest {
  int32 id = 1;
}

message DeleteBannerResponse {}

message ReorderBannersRequest {
  repeated int32 ids = 1;
}

message ReorderBannersResponse {}

// --- FAQ MESSAGES ---

message CreateFaqItemRequest {
  string question = 1;
  string answer = 2;
}

message CreateFaqItemResponse {
  FaqItem faq_item = 1;
}

message GetFaqsRequest {}

message GetFaqsResponse {
  repeated FaqItem faqs = 1;
}

message UpdateFaqItemRequest {
  FaqItem faq_item = 1;
}

message UpdateFaqItemResponse {
  FaqItem faq_item = 1;
}

message DeleteFaqItemRequest {
  int32 id = 1;
}

message DeleteFaqItemResponse {}

// --- MIPIF AUTO REPLY ---
message ListMipifAutoReplyUsersRequest {}

message MipifAutoReplyUser {
  int32 id = 1;
  string telegram_id = 2;
  string chat_id = 3;
  optional string username = 4;
  optional string first_name = 5;
  optional string last_name = 6;
  optional string matched_text = 7;
  string first_matched_at = 8;
  string reply_sent_at = 9;
  string created_at = 10;
  string updated_at = 11;
}

message ListMipifAutoReplyUsersResponse {
  repeated MipifAutoReplyUser users = 1;
}

message SendMipifWinnerMessagesRequest {
  repeated string telegram_ids = 1;
  string text = 2;
}

message MipifWinnerMessageResult {
  string telegram_id = 1;
  bool ok = 2;
  optional string error = 3;
}

message SendMipifWinnerMessagesResponse {
  int32 sent_count = 1;
  int32 failed_count = 2;
  repeated MipifWinnerMessageResult results = 3;
}

// --- ABOUT ---
message GetAboutRequest {}

message GetAboutResponse {
  About about = 1;
}

message UpsertAboutRequest {
  About about = 1;
}

message UpsertAboutResponse {
  About about = 1;
}

// --- FILIAL MESSAGES ---

message CreateFilialRequest {
  string image_url = 1;
  string title = 2;
  string address = 3;
  int32 order = 4;
  optional string description = 5;
  optional double longitude = 6;
  optional double latitude = 7;
}

message CreateFilialResponse {
  Filial filial = 1;
}

message GetFilialsRequest {}

message GetFilialsResponse {
  repeated Filial filials = 1;
}

message UpdateFilialRequest {
  Filial filial = 1;
}

message UpdateFilialResponse {
  Filial filial = 1;
}

message DeleteFilialRequest {
  int32 id = 1;
}

message DeleteFilialResponse {}

message ReorderFilialsRequest {
  repeated int32 ids = 1;
}

message ReorderFilialsResponse {}

message GetPublicFilialsRequest {}

message GetPublicFilialsResponse {
  repeated Filial filials = 1;
}

// --- PARTNER ---

message CreatePartnerRequest {
  string image_url = 1;
  string title = 2;
  string url = 3;
  int32 order = 4;
  optional string body = 5;
  optional bool is_active = 6;
  optional double longitude = 7;
  optional double latitude = 8;
  optional string address = 9;
}

message CreatePartnerResponse {
  Partner partner = 1;
}

message GetPartnersRequest {}

message GetPartnersResponse {
  repeated Partner partners = 1;
}

message UpdatePartnerRequest {
  Partner partner = 1;
}

message UpdatePartnerResponse {
  Partner partner = 1;
}

message DeletePartnerRequest {
  int32 id = 1;
}

message DeletePartnerResponse {}

message ReorderPartnersRequest {
  repeated int32 ids = 1;
}

message ReorderPartnersResponse {}

message GetPublicPartnersRequest {}

message GetPublicPartnersResponse {
  repeated Partner partners = 1;
}

// --- BLOG  ---
message CreateBlogRequest {
  string title = 1;
  optional string body = 2;
  string author = 3;
  string slug = 4;
  optional string published_at = 5;
  string image_url = 6;
  optional int32 order = 7;
}

message CreateBlogResponse {
  Blog blog = 1;
}

message GetBlogsRequest {}

message GetBlogsResponse {
  repeated Blog blogs = 1;
}

message UpdateBlogRequest {
  Blog blog = 1;
}

message UpdateBlogResponse {
  Blog blog = 1;
}

message DeleteBlogRequest {
  int32 id = 1;
}

message DeleteBlogResponse {}

message ReorderBlogsRequest {
  repeated int32 ids = 1;
}

message ReorderBlogsResponse {}

// --- DOCUMENT ---

message CreateDocumentRequest {
  string slug = 1;
  string body = 2;
  string title = 3;
}

message CreateDocumentResponse {
  Document document = 1;
}

message GetDocumentsRequest {}

message GetDocumentsResponse {
  repeated Document documents = 1;
}

message GetDocumentRequest {
  int32 id = 1;
}

message GetDocumentResponse {
  Document document = 1;
}

message UpdateDocumentRequest {
  Document document = 1;
}

message UpdateDocumentResponse {
  Document document = 1;
}

message DeleteDocumentRequest {
  int32 id = 1;
}

message DeleteDocumentResponse {}

// --- STORY ---

message CreateStoryRequest {
  string icon_url = 1;
  string title = 2;
  repeated StoryValue values = 3;
}

message CreateStoryResponse {
  Story story = 1;
}

message GetStoriesRequest {}

message GetStoriesResponse {
  repeated Story stories = 1;
}

message UpdateStoryRequest {
  Story story = 1;
}

message UpdateStoryResponse {
  Story story = 1;
}

message DeleteStoryRequest {
  int32 id = 1;
}

message DeleteStoryResponse {}

message ReorderStoriesRequest {
  repeated int32 ids = 1;
}

message ReorderStoriesResponse {}

// --- MODELS ---

message Banner {
  int32 id = 1;
  string image_url = 2;
  int32 order = 3;
  optional string link = 4;
}

message FaqItem {
  int32 id = 1;
  string question = 2;
  string answer = 3;
}

message About {
  int32 id = 1;
  optional string image_url = 2;
  optional string body = 3;
  optional double latitude = 4;
  optional double longitude = 5;
}

message Filial {
  int32 id = 1;
  string image_url = 2;
  string title = 3;
  string address = 4;
  int32 order = 5;
  optional string description = 6;
  optional double longitude = 7;
  optional double latitude = 8;
}

message Partner {
  int32 id = 1;
  string image_url = 2;
  string title = 3;
  optional string url = 4;
  int32 order = 5;
  optional string body = 6;
  optional double longitude = 7;
  optional double latitude = 8;
  bool is_active = 9;
  optional string address = 10;
}

message Blog {
  int32 id = 1;
  string title = 2;
  optional string body = 3;
  string author = 4;
  string slug = 5;
  optional string published_at = 6;
  string image_url = 7;
  int32 order = 8;
}

message Document {
  int32 id = 1;
  string slug = 2;
  string body = 3;
  string created_at = 4;
  string updated_at = 5;
  string title = 6;
}

message Story {
  int32 id = 1;
  string icon_url = 2;
  string title = 3;
  repeated StoryValue values = 4;
  int32 order = 5;
}

message StoryValue {
  int32 id = 1;
  string image_url = 2;
  optional string button = 3;
  optional string link = 4;
}