
//role control
void add_role();
void print_role(struct linkedlist* list,int cur,int end,struct Map* map);
void * showRole(struct linkedlist* list,int index);
struct Map* sortRole(struct linkedlist* list,int choice);

void role_control(){
    int choice = -1;
    struct user db = read_db_user();
    do{
        char buf[1024];
        welcome_message(buf);
        sprintf(buf+strlen(buf),"Role control\n");
        choice = choices_selecter((char*[]){
            "add admin role",
        	"list role"
        },2,buf);
        switch (choice){
            case 3:
                break;
            case 1:
                add_role();
                break;
            case 2:;
                char * SortItems[] = {
                    "admin",
                    "role",
                };
                void * list = getLinkedList(role_list_db(),0);
                lister(list,NULL,sizeofLinkedlist(list),"Role",SortItems,2,print_role,sortRole,showRole);
                //warning appears but can be ignore due to the fact that they are just pointer, no difference 
                break;
            default:
                break;
        }
    }while(choice != 3);
}


void add_role(){
    char role[100];
    printf("Enter Admin role name: ");
    fflush_stdin();
    scanf("%s", role);
    if(is_admin(role)){//check if role exist in admin file
        printf("Admin role already exist\n");
        printf("press any key to continue\n");
        fflush_stdin();
        getchar();
    }else{
        add_admin(role);
        printf("role added\n");
        printf("press any key to continue\n");
        fflush_stdin();
        getchar();
    }
    return;
}
void print_role(struct linkedlist* list,int cur,int end,struct Map* map){
    printf("%-10s%-10s%-10s\n","No.","Role","Admin?");
    if(map == NULL){
        for(int i = cur; i < end; i++){
            list = getLinkedList(list,i);
            char* name = list->data;
            printf("%-10d%-10s%-10s\n",i-cur + 5,StringCompression(name,8),is_admin(name)?"T":"F");
        }
    }else{
        for(int i = cur; i < end; i++){
            list = getLinkedList(list,map[i].key);
            char* name = list->data;
            printf("%-10d%-10s%-10s\n",i-cur + 5,StringCompression(name,8),is_admin(name)?"T":"F");
        }
    }
}

void * showRole(struct linkedlist* list,int index){
    int choice;
    list = getLinkedList(list,index);
    char* name = list->data;
    Cls();
    printf("%-10s%-10s\n","Role","Admin?");
    printf("%-10s%-10s\n",name,is_admin(name)?"T":"F");
    choice = choices_selecter((char*[]){"Toggle admin"},1,"Role control\n");
    if(choice == 1){
        if(is_admin(name)){
            remove_admin(name);
        }else{
            add_admin(name);
        }
        printf("Admin role toggled\n");
        printf("Press any key to continue\n");
        fflush_stdin();
        getchar();
    }
    return list;
}


struct Map* sortRole(struct linkedlist* list,int choice){
    struct Map* map = malloc(sizeof(struct Map)*sizeofLinkedlist(list));
    struct linkedlist* cur = getLinkedList(list,0);
    for(int i = 0; i < sizeofLinkedlist(list); i++){
        switch(choice){
            case 1:
            case 2:
                map[i].key = i;
                bool temp = !is_admin(cur->data);
                bool* tempstar = malloc(sizeof(bool));
                *tempstar = temp;
                map[i].value = tempstar;
                break;
            case 3:
            case 4:
                map[i].key = i;
                map[i].value = cur->data;
                break;
        }
        cur = cur->next;
    }
    switch(choice){
        case 1:
        case 3:
            qsort(map,sizeofLinkedlist(list),sizeof(struct Map),compare_decending_str);
            break;
        case 2:
        case 4:
            qsort(map,sizeofLinkedlist(list),sizeof(struct Map),compare_ascending_str);
            break;
    }
    return map;
}
