Zadanie 1 - TODO
================

Zadanie polega na napisaniu skryptu implementującego prosty organizer,
który umożliwia zarządzanie zadaniami do wykonania. Skrypt uruchamia się
poleceniem "todo" z parametrami opisanymi poniżej. Wszystkie potrzebne dane 
skrypt pobiera i przechowuje w katalogu ".todo" w katalogu domowym użytkownika,
który skrypt wywołał. 

Zadaniem systemu TODO jest zarządzanie wydarzeniami, z których każde jest opisane
przez swój unikalny numer identyfikacyjny (id), datę, treść i priorytet (liczba 
naturalna), na przykład:
    13: 2005-10-30, napisać maila do Agaty, 20
    14: 2005-10-23, iść na wybory, 100

Skrypt dopuszcza wiele różnych wywołań, które są omówione poniżej. W każdym wypadku
należy po wykonaniu polecenia wypisać odpowiedni przyjemny dla oka komunikat
informujący z grubsza co się stało.


ADD: ./todo add _data _treść [_priorytet]
===
Dodaj nowe wydarzenie na zadany dzień. Ostatni parametr jest opcjonalny, jeżeli
nie będzie podany przydzielamy wydarzeniu priorytet 0. Jeżeli data wypada w 
przeszłości lub dalej niż rok naprzód należy wyświetlić odp. komunikat i odmówić
wykonania operacji. Automatycznie należy dokonać przydziału nowego (unikalnego)
numeru id dla wydarzenia.

Przykład: 
./todo add 2005-11-11 "kup koniecznie ciacho" 10
Dodano na 2005-11-11 z id=321.


LIST: ./todo list [_data] 
====
Wyświetl wszystkie zadania zaplanowane na daną datę. Parametr jest opcjonalny,
w razie jego braku chodzi o zadania na dzisiaj. Należy wyświetlić id zadania,
treść i priorytet, posortowane malejąco po priorytecie. Mógłby się przydać
jakiś nagłówek.

Przykład:
./todo list 2005-10-30
ID: TREŚĆ, PRIORYTET
--------------------
13: napisać maila do Agaty, 20
76: wymienić zasłonkę, 3


DEL: ./todo del _id
===
Usuń wydarzenie o zadanym identyfikatorze.

Przykład:
./todo del 13
Usunięto id=13 na 2005-10-30: napisać maila do Agaty.


MOVE: ./todo move _id _new_date
====
Przesuń zadanie o numerze _id z jego obecnej daty na dzień _new_date. Poza tym
nic nie zmieniaj.

Przykład:
./todo move 13 2006-05-11
Przesunięto: napisać maila do Agaty z 2005-10-30 na 2006-05-13.


OLD: ./todo old move [_inc] / del / list [p/d]
===
Zrób coś ze wszystkimi przeterminowanymi zadaniami: albo usuń (del), albo przesuń
je do zadań dzisiejszych (move), albo po prostu wypisz (list). W przypadku opcji move
drugi parametr _inc mówi o ile należy zwiększyć priorytet każdego przenoszonego zadania.
W przypadku opcji list drugi parametr mówi czy zadania należy sortować
po priorytecie (p), czy po dacie (od najstarszych) i dopiero potem po 
priorytecie (d).

Przykład:
./todo old move 1
Przeniesiono na dzisiaj 2 zadań.

./todo old del
Usunięto 0 przeterminowanych zadań.


STAT: ./todo stat [_end_date]
====
Wypisz statystykę zadań zaplanowanych na przyszłość od dziś aż do daty końcowej
_end_date (opcjonalnej, jeżeli jej nie ma to do końca świata), oczywiście
w kalendarzowej kolejności dni. Należy dla każdego dnia podać liczbę zadań 
zaplanowanych na ten dzień oraz ich średni priorytet (zapaleńcy statystyki 
mogą też policzyć wariancję :) ).

Przykład:
./todo stat 2005-12-25
DATA: ILE, ŚR_PRI
-----------------
2005-12-06: 1, 23
2005-12-24: 2, 112


IMPORT: ./todo import _user [n]
======
Zaimportuj zawartość bazy zadań użytkownika _user i dodaj je do swoich wydarzeń.
Jeżeli podano opcjonalną opcję n, to importujemy tylko wydarzenia nieprzeterminowane.
W razie braku jakiejkolwiek bazy u tego użytkownika, braku dostępu do niej (patrz niżej) 
etc. należy wypisać odpowiednie komunikaty. (Uwaga! nie można skopiować całkiem
"na pałę" - dlaczego?)

Przykład:
./todo import zuzia324
Zaimportowano 23 zadań od zuzia324.

./todo import olek12 n
Brak uprawnień do odczytania bazy zadań użytkownika olek12.


BLOCK: ./todo block / unblock
=====
Zablokuj (block) lub odblokuj (unblock) dostęp do swojej bazy dla wszystkich poza sobą,
poprzed modyfikację uprawnień do odpowiednich plików i/lub katalogów (nie przejmujemy
się i nie ruszamy uprawnień do katalogu domowego - jeżeli inni nie mogą nawet przez niego
przejść, to trudno, uznajemy, że to jest ustawienie ponad nami).

Przykład:
./todo block
Zablokowano bazę.


Uwagi:
======
Należy sprawdzać, czy liczba parametrów obowiązkowych jest taka jak powinna być.
W razie błędu (zły parametr, etc.) należy wypisać stosowny komunikat. Można założyć,
że tam gdzie jako parametr ma wystąpić liczba, faktycznie będzie liczba itp.
Przy pierwszym uruchomieniu należy założyć potrzebne struktury
w katalogu .todo. Nie kładziemy bardzo dużego nacisku na efektywność (no chyba, że sposób
zaimplementowania jakiejś operacji będzie drastycznie wolny a można to bardzo łatwo zrobić 
szybciej np. przeglądanie całej listy wydarzeń w celu wybrania kolejnego unikalnego id). 
Format daty jest do wyboru przez rozwiązującego. Wewnętrzna organizacja 
zawartości katalogu .todo podobnie.


Pytania, doprecyzowania i uwagi na aszek@mimuw.edu.pl. Rozwiązania do 30.11.2005 tamże.