syntax = "proto3";

package sunnah;

option go_package = "./proto;sunnah";

service Sunnah {
	rpc Collections(CollectionsRequest) returns (CollectionsResponse) {}
	rpc Books(BooksRequest) returns (BooksResponse) {}
	rpc Chapters(ChaptersRequest) returns (ChaptersResponse) {}
	rpc Hadiths(HadithsRequest) returns (HadithsResponse) {}
}

message Collection {
	// Name of the collection e.g bukhari
	string name = 1;
	// Title of the collection e.g Sahih al-Bukhari
	string title = 2;
	// Arabic title if available
	string arabic_title = 3;
	// An introduction explaining the collection	
	string summary = 4;
	// Total hadiths in the collection
	int32 hadiths = 5;
}

message Book {
	// number of the book e.g 1
	int32 id = 1;
	// name of the book
	string name = 2;
	// arabic name of the book
	string arabic_name = 3;
	// number of hadiths in the book
	int32 hadiths = 4;
}

message Chapter {
	// the chapter id e.g 1
	int32 id = 1;
	// the chapter key e.g 1.00
	string key = 2;
	// the book number
	int32 book = 3;
	// title of the chapter
	string title = 4;
	// arabic title
	string arabic_title = 5;
}

message Hadith {
	// hadith id
	int32 id = 1;
	// the chapter id
	int32 chapter = 2;
	// the chapter key
	string chapter_key = 3;
	// the chapter title
	string chapter_title = 4;
	// the arabic chapter title
	string arabic_chapter_title = 5;
	// hadith text
	string text = 6;
	// the arabic text
	string arabic_text = 7;
}

// Get a list of available collections. A collection is 
// a compilation of hadiths collected and written by an author.
message CollectionsRequest {
	// The page in the pagination
	int32 page = 1;
	// Number of collections to limit to
	int32 limit = 2;
}

message CollectionsResponse {
	repeated Collection collections = 1;
}

// Get a list of books from within a collection. A book can contain many chapters 
// each with its own hadiths.
message BooksRequest {
	// Name of the collection
	string collection = 1;
	// The page in the pagination
	int32 page = 2;
	// Limit the number of books returned
	int32 limit = 3;
}

message BooksResponse {
	// Name of the collection
	string collection = 1;
	// The total overall books
	int32 total = 2;
	// The page requested
	int32 page = 3;
	// The limit specified
	int32 limit = 4;
	// A list of books
	repeated Book books = 5;
}

// Get all the chapters of a given book within a collection.
message ChaptersRequest {
	// name of the collection
	string collection = 1;
	// number of the book
	int32 book = 2;
	// The page in the pagination
	int32 page = 3;
	// Limit the number of chapters returned
	int32 limit = 4;
}

message ChaptersResponse {
	// name of the collection
	string collection = 1;
	// number of the book
	int32 book = 2;
	// The page in the pagination
	int32 page = 3;
	// Limit the number of chapters returned
	int32 limit = 4;
	// Total chapters in the book	
	int32 total = 5;
	// The chapters of the book
	repeated Chapter chapters = 6;
}

// Hadiths returns a list of hadiths and their corresponding text for a 
// given book within a collection. 
message HadithsRequest {
	// name of the collection
	string collection = 1;
	// number of the book
	int32 book = 2;
	// The page in the pagination
	int32 page = 3;
	// Limit the number of hadiths
	int32 limit = 4;
}

message HadithsResponse {
	// name of the collection
	string collection = 1;
	// number of the book
	int32 book = 2;
	// The page in the pagination
	int32 page = 3;
	// Limit the number of hadiths returned
	int32 limit = 4;
	// Total hadiths in the  book
	int32 total = 5;
	// The hadiths of the book
	repeated Hadith hadiths = 7;
}
