#include #include #include #include #include "include/colors.h" #include "include/config.h" #include "include/tasks.h" #include "include/db.h" void help(char* name) { printf(BLUE "\t-- TaKl " VERSION " --\n" RESET); printf("Utilisation: %s ( list | info | add | rm | done )\n", name); printf("\tadd [date]\n"); printf("\tFormat de la date:\n"); printf("\t\tRelatif: min+%%d, h+%%d, j+%%d\n"); printf("\t\tAbsolu: dd/mm (pas de changement d'année pour l'instant\n"); printf("\tinfo ...\n"); printf("\tdone ...\n"); printf("\trm ...\n"); } time_t parseDateTime(const char* input) { struct tm date = {0}; // Initialize with zeros // Get current time time_t now = time(NULL); struct tm* current_time = localtime(&now); // Copy current time to 'date' structure date.tm_year = current_time->tm_year; date.tm_mon = current_time->tm_mon; date.tm_mday = current_time->tm_mday; date.tm_hour = current_time->tm_hour; date.tm_min = current_time->tm_min; date.tm_sec = current_time->tm_sec; int offset; // Accepted formats: min+%d, h+%d, j+%d if (sscanf(input, "min+%d", &offset)) { date.tm_min += offset; return mktime(&date); } else if (sscanf(input, "h+%d", &offset)) { date.tm_hour += offset; return mktime(&date); } else if (sscanf(input, "j+%d", &offset)) { date.tm_mday += offset; return mktime(&date); } // Check if the input format is "dd/mm" if (sscanf(input, "%d/%d", &date.tm_mday, &date.tm_mon) == 2) { // Set the year to the current year date.tm_year = current_time->tm_year; // Adjust month and day values to be zero-based date.tm_hour = 0; date.tm_min = 0; date.tm_sec = 0; // Convert 'date' structure to 'time_t' value return mktime(&date); } return -1; // Return an error value } int add(int argc, char* argv[]) { if (argc < 3) { printf(BOLD YELLOW "Argument manquant\n" RESET); help(argv[0]); return 1; } time_t due_to = 0; if (argc > 3) { due_to = parseDateTime(argv[3]); if (due_to == -1) { printf(BOLD YELLOW "Échéance invalide, la tâche sera créé sans échéance.\n" RESET); due_to = 0; } } task_t t = create_task(argv[2], due_to); if (t.id == -1) { return 1; } if (add_task(t) != 0) { printf("Erreur lors de l'ajout à la base de données\n"); return 1; } printf(BOLD YELLOW "[%d]" RESET " ajoutée\n", t.id); return 0; } int info(int argc, char* argv[]) { if (argc < 3) { printf(BOLD YELLOW "Argument manquant\n" RESET); help(argv[0]); return 1; } for (int i=2; i < argc; i++) { int id = strtol(argv[i], NULL, 10); task_t t; t.id = -1; get_task(id, &t); if (t.id == -1) { printf(YELLOW "Tâche " BOLD "[%s]" RESET YELLOW " inexistante. Vérifiez que l'identifiant est bien correct\n" RESET, argv[i]); return 1; } print_task(t); free(t.text); } return 0; } int mark_done(int argc, char* argv[]) { if (argc < 3) { printf(BOLD YELLOW "Argument manquant\n" RESET); help(argv[0]); return 1; } for (int i=2; i < argc; i++) { int id = strtol(argv[i], NULL, 10); task_t t; t.id = -1; get_task(id, &t); if (t.id == -1) { printf(YELLOW "Tâche " BOLD "[%s]" RESET YELLOW " inexistante. Vérifiez que l'identifiant est bien correct\n" RESET, argv[i]); return 1; } t.done = true; update_task(t); } return 0; } int delete(int argc, char* argv[]) { if (argc < 3) { printf(BOLD YELLOW "Argument manquant\n" RESET); help(argv[0]); return 1; } for (int i=2; i < argc; i++) { int id = strtol(argv[i], NULL, 10); task_t t; t.id = -1; get_task(id, &t); if (t.id == -1) { printf(YELLOW "Tâche " BOLD "[%s]" RESET YELLOW " inexistante. Vérifiez que l'identifiant est bien correct\n" RESET, argv[i]); return 1; } delete_task(t.id); } return 0; } int main(int argc, char* argv[]) { srand(time(NULL)); if (argc <= 1) { help(argv[0]); return 0; } if (!strcmp(argv[1], "add")) { return add(argc, argv); } else if (!strcmp(argv[1], "list")) { return list_tasks(); } else if (!strcmp(argv[1], "info")) { return info(argc, argv); } else if (!strcmp(argv[1], "done")) { return mark_done(argc, argv); } else if (!strcmp(argv[1], "rm")) { return delete(argc, argv); } printf(YELLOW "Option invalide " BOLD "%s\n" RESET, argv[1]); return 1; }