#!/usr/bin/env python3

import argparse

import mo.db as db
import mo.users
import mo.util
from mo.util import die, init_standalone

parser = argparse.ArgumentParser(description='Přidělí uživateli roli')
parser.add_argument('--email', type=str, help='e-mailová adresa uživatele')
parser.add_argument('--uid', type=int, help='ID uživatele')
parser.add_argument('--role', type=str, help='název role', required=True)
parser.add_argument('--place', type=str, help='omezení role na místo s daným kódem')
parser.add_argument('--cat', type=str, help='omezení role na danou kategorii')
parser.add_argument('--year', type=int, help='omezení role na daný ročník')
parser.add_argument('--seq', type=int, help='omezení role na dané pořadí kola')

args = parser.parse_args()
init_standalone()
session = db.get_session()

if args.email and args.uid:
    parser.error('--email a --uid nesmí být uvedeny současně')
elif args.email:
    user = mo.users.user_by_email(args.email)
elif args.uid:
    user = mo.users.user_by_uid(args.uid)
else:
    parser.error('Je nutné vybrat uživatele pomocí --email nebo --uid')

if not user:
    die("Tento uživatel neexistuje")

if user.is_admin:
    die("Tento uživatel je admin, nemá smysl přidělovat mu další práva")

if not user.is_org:
    die("Tento uživatel není organizátor")

role = getattr(db.RoleType, args.role, None)
if role is None:
    die("Tato role neexistuje")

if args.place:
    for_place = db.get_place_by_code(args.place)
    if for_place is None:
        die("Toto místo neexistuje")
else:
    for_place = db.get_root_place()

assert for_place is not None
ur = db.UserRole(
    user_id=user.user_id,
    place=for_place,
    role=role,
    category=args.cat,
    year=args.year,
    seq=args.seq,
)
session.add(ur)
session.flush()

mo.util.log(db.LogType.user, user.user_id, {
    'action': 'new-role',
    'role': db.row2dict(ur),
})
session.commit()