/**
* On Line Bookstore IDL
* @author : Ji Eun Kim
* @author : Adam Jenkins
* @author : Alexey Stolpovskikh
* @author : Yuk-Chung Eric Kam
* @author : Tae Sung Chung
* @date : Feb, 15 2003
*/

module BookStoreApp
{

/**
* Structure for userprofile data
*/
struct UserProfileStruct
{
string first_name; // 30 characters max,
string last_name; // 30 characters max
string password; // 20 characters max
string user_id; // 20 characters max I think this should be a unsigned integer
unsigned short age; // age
string creditcard_num; //16 character for fake anyways right now
unsigned short creditcard_type; //10 character
string exp_date; // Who cares for fake
string user_state; // 10 character state
string address; // Fake too since we don't ship anything
};


/**
* Structure for booklist data
*/
struct BookInfo
{
string isbn; // 10 characters max
string name; // 200 characters max
string author; // 200 characters max
string publisher; // 200 characters max
long inventory; // 10 integer max
double price; // double max
// string pic_file; // picture file but not used yet
};

/**
* List of BookInfo
*/
typedef sequence<BookInfo> BookInfoList;

/**
* List of Exception 1 : Database Failure
*/

exception DatabaseConnectionFailure{}; // For dirver connection failure
exception DatabaseAccessFailure{}; // For my-sql access failure
exception DatabaseSQLFailure{}; // For database sql execution failure
exception DatabaseRoleBackFailure{}; // For database rollback failure
exception DatabaseDisconnectionFailure{};// For database disconnection failure

/**
* List of Exceptions 2: User Profile for registration , log-in, log-out
*/

exception UserError
{ // This exception is thrown when any user login error occurs
unsigned long errorcode; // error code
string ErrorDescription; // Error description
};

enum UserErrorCodes { UserExistsError, // For multiple registration error
BadPasswordError, // For wrong password
UserDoesNotExistError, // For someone trying to log in who doesn't exist
UserAlreadyLoggedInError, // For user not allowed to have two sessions
UserFirstNameLengthError, //String size constraints
UserLastNameLengthError, //String size constraints
UserIDLengthError, //String size constraints
UserPasswordLengthError, //String size constraints
UserAgeError, //User too old or Young or something
UserInformationMissingError //Critical info missing
};


/**
* List of Exceptions 3 : Book Information for adding, deleting, ordering, searching books
*/

exception BookDoesNotExistError{}; // For book not available
exception BookNameTooLongError{}; // String size constraints
exception BookNameTooShortError{}; // String size constraints
exception BookInformationMissingError{};// Critical info missing

/**
* Interface
*/
//interface BookStore
interface UserInfo
{

/**
* Registration
* @version : baseline
* @param RegUser User Profile Structure
* @return True if registration is successful
* @raises
* @raises
*/

boolean registration(in UserProfileStruct RegUser)
raises (DatabaseSQLFailure, UserError);

/**
* Log_in
* @version : baseline
* @param user_id User ID to log in
* @param user_passwd User password
* @return True if Log_in is successful
* @raises DatabaseConnectionFailure Failed to connect database Driver
* @raises DatabaseSQLFailure Failed to execute SQL query
*/

boolean Log_in (in string user_id, in string user_passwd)
raises (DatabaseSQLFailure, UserError);

/**
* Log_out
* @version : baseline
* @param user_id User ID for log out
* @return True if Log_out is successful
* @raises DatabaseConnectionFailure Failed to connect database Driver
* @raises DatabaseSQLFailure Failed to execute SQL query
*/

boolean Log_out (in string user_id)
raises (DatabaseSQLFailure, UserError);

/**
* GetUserData
* @version : baseline
* @param user_id User ID for displying user
* @return True if Log_out is successful
* @raises DatabaseConnectionFailure Failed to connect database Driver
* @raises DatabaseSQLFailure Failed to execute SQL query
*/

UserProfileStruct GetUserData(in string user_id)
raises (DatabaseSQLFailure, UserError);

/**
* searchBook
* @version : baseline
* @param search_item search item such as title, author
* @param search_text String search text
* @return BookInfoList Array of BookInfo structure
* @raises DatabaseConnectionFailure Failed to connect database Driver
* @raises DatabaseSQLFailure Failed to execute SQL query
* @raises BookDoesNotExistError No data for searching books
*/

BookInfoList searchBook(in string search_item, in string search_text)
raises (DatabaseConnectionFailure,
DatabaseAccessFailure,
DatabaseSQLFailure,
DatabaseDisconnectionFailure,
DatabaseRoleBackFailure,
BookDoesNotExistError
);


/**
* orderBook
* @version : baseline
* @param search_item search item such as title, author
* @param search_text String search text
* @return BookInfoList Array of BookInfo structure
* @raises DatabaseConnectionFailure Failed to connect database Driver
* @raises DatabaseSQLFailure Failed to execute SQL query
* @raises BookDoesNotExistError No data for searching books
*/
boolean orderBook(in string bookISBNm)
raises (DatabaseConnectionFailure,
DatabaseAccessFailure,
DatabaseSQLFailure,
DatabaseDisconnectionFailure,
DatabaseRoleBackFailure,
BookDoesNotExistError
);

/**
* deletBook
* @version : baseline
* @param search_item search item such as title, author
* @param search_text String search text
* @return BookInfoList Array of BookInfo structure
* @raises DatabaseConnectionFailure Failed to connect database Driver
* @raises DatabaseSQLFailure Failed to execute SQL query
* @raises BookDoesNotExistError No data for searching books
*/
boolean deleteBook(in string bookISBN)
raises (DatabaseConnectionFailure,
DatabaseAccessFailure,
DatabaseSQLFailure,
DatabaseDisconnectionFailure,
DatabaseRoleBackFailure,
BookDoesNotExistError
);

/**
* addBook
* @version : baseline
* @param search_item search item such as title, author
* @param search_text String search text
* @return BookInfoList Array of BookInfo structure
* @raises DatabaseConnectionFailure Failed to connect database Driver
* @raises DatabaseSQLFailure Failed to execute SQL query
* @raises BookDoesNotExistError No data for searching books
*/
boolean addBook(in BookInfo bookInfo)
raises (DatabaseConnectionFailure,
DatabaseAccessFailure,
DatabaseSQLFailure,
DatabaseDisconnectionFailure,
DatabaseRoleBackFailure,
BookDoesNotExistError
);
};
};