# Hệ thống quản lý công việc học tập (phiên bản mô phỏng) 
# Chạy được trực tiếp trên Ideone 
 
from  datetime  import  datetime 
 
# ----- Dữ liệu mẫu ----- 
users =  [ ] 
tasks =  [ ] 
subjects =  [ ] 
 
# ----- Các hàm quản lý ----- 
def  add_user( name,  email ) :
    user  =  { "id" : len ( users) +1 ,  "name" : name,  "email" : email } 
    users.append ( user ) 
    return  user 
 
def  add_subject( name) :
    subject =  { "id" : len ( subjects) +1 ,  "name" : name} 
    subjects.append ( subject) 
    return  subject
 
def  add_task( title,  subject_id,  owner_id,  due_date) :
    task =  { 
        "id" : len ( tasks) +1 , 
        "title" : title, 
        "subject_id" : subject_id, 
        "owner_id" : owner_id, 
        "due_date" : due_date, 
        "status" : "todo" 
    } 
    tasks.append ( task) 
    return  task
 
def  update_task( task_id,  **kwargs) :
    for  t in  tasks:
        if  t[ "id" ]  ==  task_id:
            t.update ( kwargs) 
            return  t
    return  None 
 
def  search_tasks( keyword = None ,  status= None ) :
    result =  tasks
    if  keyword :
        result =  [ t for  t in  result if  keyword .lower ( )  in  t[ "title" ] .lower ( ) ] 
    if  status:
        result =  [ t for  t in  result if  t[ "status" ]  ==  status] 
    return  result
 
# ----- Mô phỏng hoạt động ----- 
u1 =  add_user( "Nguyễn Khang" ,  "khang@example.com" ) 
u2 =  add_user( "Minh An" ,  "minhan@example.com" ) 
 
s1 =  add_subject( "Toán học" ) 
s2 =  add_subject( "Lịch sử" ) 
 
add_task( "Ôn tập chương 3" ,  s1[ "id" ] ,  u1[ "id" ] ,  "2025-10-20" ) 
add_task( "Làm bài tập số 5" ,  s1[ "id" ] ,  u1[ "id" ] ,  "2025-10-21" ) 
add_task( "Đọc tài liệu chiến tranh thế giới" ,  s2[ "id" ] ,  u2[ "id" ] ,  "2025-10-22" ) 
 
update_task( 2 ,  status= "done" ) 
 
# ----- Khai thác thông tin ----- 
print ( "=== Danh sách người dùng ===" ) 
for  u in  users:
    print ( f"- {u['name']} ({u['email']})" ) 
 
print ( "\n === Danh sách môn học ===" ) 
for  s in  subjects:
    print ( f"- {s['name']}" ) 
 
print ( "\n === Công việc cần làm ===" ) 
for  t in  tasks:
    sub =  [ s for  s in  subjects if  s[ "id" ]  ==  t[ "subject_id" ] ] [ 0 ] [ "name" ] 
    print ( f"[{t['status']}] {t['title']} ({sub}) - hạn {t['due_date']}" ) 
 
print ( "\n === Tìm kiếm công việc chứa 'bài tập' ===" ) 
for  t in  search_tasks( keyword = "bài tập" ) :
    print ( f"- {t['title']} ({t['status']})" ) 
 
				IyBI4buHIHRo4buRbmcgcXXhuqNuIGzDvSBjw7RuZyB2aeG7h2MgaOG7jWMgdOG6rXAgKHBoacOqbiBi4bqjbiBtw7QgcGjhu49uZykKIyBDaOG6oXkgxJHGsOG7o2MgdHLhu7FjIHRp4bq/cCB0csOqbiBJZGVvbmUKCmZyb20gZGF0ZXRpbWUgaW1wb3J0IGRhdGV0aW1lCgojIC0tLS0tIEThu68gbGnhu4d1IG3huqt1IC0tLS0tCnVzZXJzID0gW10KdGFza3MgPSBbXQpzdWJqZWN0cyA9IFtdCgojIC0tLS0tIEPDoWMgaMOgbSBxdeG6o24gbMO9IC0tLS0tCmRlZiBhZGRfdXNlcihuYW1lLCBlbWFpbCk6CiAgICB1c2VyID0geyJpZCI6IGxlbih1c2VycykrMSwgIm5hbWUiOiBuYW1lLCAiZW1haWwiOiBlbWFpbH0KICAgIHVzZXJzLmFwcGVuZCh1c2VyKQogICAgcmV0dXJuIHVzZXIKCmRlZiBhZGRfc3ViamVjdChuYW1lKToKICAgIHN1YmplY3QgPSB7ImlkIjogbGVuKHN1YmplY3RzKSsxLCAibmFtZSI6IG5hbWV9CiAgICBzdWJqZWN0cy5hcHBlbmQoc3ViamVjdCkKICAgIHJldHVybiBzdWJqZWN0CgpkZWYgYWRkX3Rhc2sodGl0bGUsIHN1YmplY3RfaWQsIG93bmVyX2lkLCBkdWVfZGF0ZSk6CiAgICB0YXNrID0gewogICAgICAgICJpZCI6IGxlbih0YXNrcykrMSwKICAgICAgICAidGl0bGUiOiB0aXRsZSwKICAgICAgICAic3ViamVjdF9pZCI6IHN1YmplY3RfaWQsCiAgICAgICAgIm93bmVyX2lkIjogb3duZXJfaWQsCiAgICAgICAgImR1ZV9kYXRlIjogZHVlX2RhdGUsCiAgICAgICAgInN0YXR1cyI6ICJ0b2RvIgogICAgfQogICAgdGFza3MuYXBwZW5kKHRhc2spCiAgICByZXR1cm4gdGFzawoKZGVmIHVwZGF0ZV90YXNrKHRhc2tfaWQsICoqa3dhcmdzKToKICAgIGZvciB0IGluIHRhc2tzOgogICAgICAgIGlmIHRbImlkIl0gPT0gdGFza19pZDoKICAgICAgICAgICAgdC51cGRhdGUoa3dhcmdzKQogICAgICAgICAgICByZXR1cm4gdAogICAgcmV0dXJuIE5vbmUKCmRlZiBzZWFyY2hfdGFza3Moa2V5d29yZD1Ob25lLCBzdGF0dXM9Tm9uZSk6CiAgICByZXN1bHQgPSB0YXNrcwogICAgaWYga2V5d29yZDoKICAgICAgICByZXN1bHQgPSBbdCBmb3IgdCBpbiByZXN1bHQgaWYga2V5d29yZC5sb3dlcigpIGluIHRbInRpdGxlIl0ubG93ZXIoKV0KICAgIGlmIHN0YXR1czoKICAgICAgICByZXN1bHQgPSBbdCBmb3IgdCBpbiByZXN1bHQgaWYgdFsic3RhdHVzIl0gPT0gc3RhdHVzXQogICAgcmV0dXJuIHJlc3VsdAoKIyAtLS0tLSBNw7QgcGjhu49uZyBob+G6oXQgxJHhu5luZyAtLS0tLQp1MSA9IGFkZF91c2VyKCJOZ3V54buFbiBLaGFuZyIsICJraGFuZ0BleGFtcGxlLmNvbSIpCnUyID0gYWRkX3VzZXIoIk1pbmggQW4iLCAibWluaGFuQGV4YW1wbGUuY29tIikKCnMxID0gYWRkX3N1YmplY3QoIlRvw6FuIGjhu41jIikKczIgPSBhZGRfc3ViamVjdCgiTOG7i2NoIHPhu60iKQoKYWRkX3Rhc2soIsOUbiB04bqtcCBjaMawxqFuZyAzIiwgczFbImlkIl0sIHUxWyJpZCJdLCAiMjAyNS0xMC0yMCIpCmFkZF90YXNrKCJMw6BtIGLDoGkgdOG6rXAgc+G7kSA1IiwgczFbImlkIl0sIHUxWyJpZCJdLCAiMjAyNS0xMC0yMSIpCmFkZF90YXNrKCLEkOG7jWMgdMOgaSBsaeG7h3UgY2hp4bq/biB0cmFuaCB0aOG6vyBnaeG7m2kiLCBzMlsiaWQiXSwgdTJbImlkIl0sICIyMDI1LTEwLTIyIikKCnVwZGF0ZV90YXNrKDIsIHN0YXR1cz0iZG9uZSIpCgojIC0tLS0tIEtoYWkgdGjDoWMgdGjDtG5nIHRpbiAtLS0tLQpwcmludCgiPT09IERhbmggc8OhY2ggbmfGsOG7nWkgZMO5bmcgPT09IikKZm9yIHUgaW4gdXNlcnM6CiAgICBwcmludChmIi0ge3VbJ25hbWUnXX0gKHt1WydlbWFpbCddfSkiKQoKcHJpbnQoIlxuPT09IERhbmggc8OhY2ggbcO0biBo4buNYyA9PT0iKQpmb3IgcyBpbiBzdWJqZWN0czoKICAgIHByaW50KGYiLSB7c1snbmFtZSddfSIpCgpwcmludCgiXG49PT0gQ8O0bmcgdmnhu4djIGPhuqduIGzDoG0gPT09IikKZm9yIHQgaW4gdGFza3M6CiAgICBzdWIgPSBbcyBmb3IgcyBpbiBzdWJqZWN0cyBpZiBzWyJpZCJdID09IHRbInN1YmplY3RfaWQiXV1bMF1bIm5hbWUiXQogICAgcHJpbnQoZiJbe3RbJ3N0YXR1cyddfV0ge3RbJ3RpdGxlJ119ICh7c3VifSkgLSBo4bqhbiB7dFsnZHVlX2RhdGUnXX0iKQoKcHJpbnQoIlxuPT09IFTDrG0ga2nhur9tIGPDtG5nIHZp4buHYyBjaOG7qWEgJ2LDoGkgdOG6rXAnID09PSIpCmZvciB0IGluIHNlYXJjaF90YXNrcyhrZXl3b3JkPSJiw6BpIHThuq1wIik6CiAgICBwcmludChmIi0ge3RbJ3RpdGxlJ119ICh7dFsnc3RhdHVzJ119KSIp