#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#define M 50
struct date {
    int year;
    int month;
    int day;
};
struct library {
    int book_num;           // 图书编号
    char book_name[40];     // 图书名称
    char author_name[10];   // 作者名称
    float book_price;       // 图书价格
    char publisher[40];     // 出版社
    struct date publish_time; // 出版时间
    char book_state[2];     // 图书存在状态(0 为在馆,1 为借出)
    char reader_name[10];   // 读者姓名
    int reader_num;         // 读者编号
};
// 函数声明
int input(struct library book[]);
void list(struct library book[], int n);
int Delete_num(struct library book[], int n);
int borrow_book(struct library book[], int n);
int return_book(struct library book[], int n);
int menu();
void saverecord(struct library book[], int n);
int loadrecord(struct library book[]);
int main() {
    struct library b[M];
    int length;
    while (1) {
        switch (menu()) {
            case 1:
                length = input(b);
                if (length != -1) {
                    saverecord(b, length);
                }
                break;
            case 2:
                length = loadrecord(b);
                list(b, length);
                break;
            case 3:
                length = loadrecord(b);
                length = Delete_num(b, length);
                saverecord(b, length);
                break;
            case 4:
                length = loadrecord(b);
                length = borrow_book(b, length);
                saverecord(b, length);
                break;
            case 5:
                length = loadrecord(b);
                length = return_book(b, length);
                saverecord(b, length);
                break;
            case 0:
                exit(0);
        }
    }
    return 0;
}
int menu() {
    int c;
    system("mode con:cols=48 lines=30000");
    system("color 0B");
    printf("\t\t\t\t------------------------\n");
    printf("\t\t\t\t+  图书信息管理系统  +\n");
    printf("\t\t\t\t------------------------\n");
    printf("\t\t\t\t 1.输入图书信息\n");
    printf("\t\t\t\t 2.显示图书信息\n");
    printf("\t\t\t\t 3.按图书编号删除图书信息\n");
    printf("\t\t\t\t 4.借书\n");
    printf("\t\t\t\t 5.还书\n");
    printf("\t\t\t\t 0.退出\n");
printf("调试者:24信息管理与信息系统1班-庞佳琪\n");
    printf("\t\t\t\t------------------------\n");
    do {
        printf("\n\t\t\t Enter your choice(0-5):");
        if (scanf("%d", &c) != 1) {
            while (getchar() != '\n');
            continue;
        }
    } while (c < 0 || c > 5);
    return c;
}
int input(struct library book[]) {
    int i, n;
    system("cls");
    printf("\t输入图书的数量:\n");
    scanf("%d", &n);
    system("cls");
    printf("\t开始输入记录:\n");
    for (i = 0; i < n; i++) {
        printf("\n\t第%d条记录的图书编号:", i + 1);
        scanf("%d", &book[i].book_num);
        printf("\n\t第%d条记录的图书名称:", i + 1);
        scanf("%s", book[i].book_name);
        printf("\n\t第%d条记录的图书作者姓名:", i + 1);
        scanf("%s", book[i].author_name);
        printf("\n\t第%d条记录的图书价格:", i + 1);
        scanf("%f", &book[i].book_price);
        printf("\n\t第%d条记录的图书出版社:", i + 1);
        scanf("%s", book[i].publisher);
        printf("\n\t第%d条记录的图书出版时间:", i + 1);
        scanf("%d-%d-%d", &book[i].publish_time.year, &book[i].publish_time.month, &book[i].publish_time.day);
        // 初始化图书状态、读者信息
        strcpy(book[i].book_state, "0");
        strcpy(book[i].reader_name, "none");
        book[i].reader_num = 0;
    }
    printf("\t****************************************\n");
    printf("\t               已输入成功!\n");
    printf("\t****************************************\n");
    getchar();
    getchar();
    system("cls");
    return n;
}
void list(struct library book[], int n) {
    int i;
    system("cls");
    printf("图书信息如下:\n");
    printf("图书编号\t图书名称\t作者\t单价\t出版社\t出版时间\t存在状态\t读者姓名\t读者学号\n");
    for (i = 0; i < n; i++) {
        printf("%d\t\t%s\t\t%s\t%.2f\t%s\t%d-%d-%d\t%s\t\t%s\t%d\n", 
               book[i].book_num, book[i].book_name, book[i].author_name, book[i].book_price, 
               book[i].publisher, book[i].publish_time.year, book[i].publish_time.month, 
               book[i].publish_time.day, book[i].book_state, book[i].reader_name, book[i].reader_num);
    }
    printf("\t\t\t\t press any key enter menu......\n");
    getchar();
    getchar();
    system("cls");
}
int Delete_num(struct library book[], int n) {
    int i, j, flag = 0;
    int bnum;
    system("cls");
    printf("请输入想要删除图书的编号:");
    scanf("%d", &bnum);
    for (i = 0; i < n; i++) {
        if (book[i].book_num == bnum) {
            flag = 1;
            system("cls");
            printf("图书馆图书信息如下:\n");
            printf("\t图书编号\t图书名称\t作者\t单价\t出版社\t出版时间\t存在状态\t读者姓名\t读者学号\n");
            printf("\t%d\t\t%s\t\t%s\t%.2f\t%s\t%d-%d-%d\t%s\t\t%s\t%d\n", 
                   book[i].book_num, book[i].book_name, book[i].author_name, book[i].book_price, 
                   book[i].publisher, book[i].publish_time.year, book[i].publish_time.month, 
                   book[i].publish_time.day, book[i].book_state, book[i].reader_name, book[i].reader_num);
            printf("是否要删除此信息?(y/n):");
            char ch = getchar();
            getchar();
            if (ch == 'y' || ch == 'Y') {
                for (j = i; j < n - 1; j++) {
                    book[j] = book[j + 1];
                }
                n--;
                printf("成功删除图书!\n");
            }
            break;
        }
    }
    if (flag == 0) {
        printf("\t\t\t\t查无此书!\n");
    }
    printf("\t\t\t\t****************************************\n");
    printf("\t\t\t\t press any key enter menu......\n");
    getchar();
    getchar();
    system("cls");
    return n;
}
int borrow_book(struct library book[], int n) {
    int i, flag = 0;
    int bnum;
    char ch;
    system("cls");
    printf("请输入想借出图书的编号:");
    scanf("%d", &bnum);
    for (i = 0; i < n; i++) {
        if (book[i].book_num == bnum) {
            flag = 1;
            system("cls");
            printf("图书馆图书信息如下:\n");
            printf("图书编号\t图书名称\t作者\t单价\t出版社\t出版时间\t存在状态\t读者姓名\t读者学号\n");
            printf("%d\t\t%s\t\t%s\t%.2f\t%s\t%d-%d-%d\t%s\t\t%s\t%d\n", 
                   book[i].book_num, book[i].book_name, book[i].author_name, book[i].book_price, 
                   book[i].publisher, book[i].publish_time.year, book[i].publish_time.month, 
                   book[i].publish_time.day, book[i].book_state, book[i].reader_name, book[i].reader_num);
            
            printf("是否要借出此书?(y/n):");
            // 注意:这里要清理缓冲区!
            getchar(); // 清理之前的换行符
            ch = getchar(); // 读取用户输入的 y/n
            if (ch == 'y' || ch == 'Y') {
                if (strcmp(book[i].book_state, "1") == 0) {
                    printf("该书已被借出,无法再次借出!\n");
                } else {
                    strcpy(book[i].book_state, "1");
                    printf("请输入读者姓名:");
                    scanf("%s", book[i].reader_name); // 现在会正常执行
                    printf("请输入读者学号:");
                    scanf("%d", &book[i].reader_num);
                    printf("成功借出图书!\n");
                }
            }
            break;
        }
    }
    if (flag == 0) {
        printf("查无此书!\n");
    }
    printf("****************************************\n");
    printf("press any key enter menu......\n");
    getchar();
    getchar();
    system("cls");
    return n;
}
int return_book(struct library book[], int n) {
    int i, flag = 0;
    int bnum;
    char ch;
    system("cls");
    printf("请输入归还图书的编号:");
    scanf("%d", &bnum);
    for (i = 0; i < n; i++) {
        if (book[i].book_num == bnum) {
            flag = 1;
            system("cls");
            printf("图书馆图书信息如下:\n");
            printf("图书编号\t图书名称\t作者\t单价\t出版社\t出版时间\t存在状态\t读者姓名\t读者学号\n");
            printf("%d\t\t%s\t\t%s\t%.2f\t%s\t%d-%d-%d\t%s\t\t%s\t%d\n", 
                   book[i].book_num, book[i].book_name, book[i].author_name, book[i].book_price, 
                   book[i].publisher, book[i].publish_time.year, book[i].publish_time.month, 
                   book[i].publish_time.day, book[i].book_state, book[i].reader_name, book[i].reader_num);
            
            printf("是否要归还此书?(y/n):");
            // 清理缓冲区,避免之前的换行符影响
            getchar(); 
            ch = getchar(); 
            if (ch == 'y' || ch == 'Y') {
                if (strcmp(book[i].book_state, "0") == 0) {
                    printf("该书未被借出,无需归还!\n");
                } else {
                    strcpy(book[i].book_state, "0");
                    strcpy(book[i].reader_name, "none");
                    book[i].reader_num = 0;
                    printf("成功归还图书!\n");
                }
            }
            break;
        }
    }
    if (flag == 0) {
        printf("查无此书!\n");
    }
    printf("****************************************\n");
    printf("press any key enter menu......\n");
    getchar();
    getchar();
    system("cls");
    return n;
}
void saverecord(struct library book[], int n) {
    FILE *fp;
    fp = fopen("library.dat", "wb");
    if (fp == NULL) {
        printf("can not open file\n");
        exit(1);
    }
    for (int i = 0; i < n; i++) {
        fwrite(&book[i], sizeof(struct library), 1, fp);
    }
    fclose(fp);
}
int loadrecord(struct library book[]) {
    FILE *fp;
    int n = 0;
    fp = fopen("library.dat", "rb");
    if (fp == NULL) {
        printf("can not open file\n");
        exit(0);
    }
    while (fread(&book[n], sizeof(struct library), 1, fp) == 1 && n < M) {
        n++;
    }
    fclose(fp);
    return n;
}