from "../lib/common.ry" import users, posts, follows, counters, count_items, text_or_empty, number_or_zero, api_error, request_input, username_key, follow_key, counter_key, post_key, find_user, current_user_doc, active_viewer_username, next_sequence, is_username_char, is_valid_username, is_valid_password, is_valid_bio, is_valid_post_body, user_brief_from_doc, public_user_from_doc, serialize_post_doc, insert_post_desc, sort_posts_desc, collect_posts, discover_posts, user_posts, home_feed_posts

fn register(app)
    @app.get("/api/me")
    fn me()
        user = current_user_doc()
        if (user == None)
            return app.json({"authenticated": False, "csrf_token": session.csrf_token()})

        username = text_or_empty(user["username"])
        return app.json({
            "authenticated": True,
            "csrf_token": session.csrf_token(),
            "user": public_user_from_doc(user, username)
        })

    @app.post("/api/auth/signup")
    fn signup()
        username = text_or_empty(request_input("username"))
        password = text_or_empty(request_input("password"))
        bio = text_or_empty(request_input("bio"))

        if (username == "" || password == "")
            return api_error(400, "Username and password are required")

        if (is_valid_username(username) == False)
            return api_error(400, "Username must be 3-20 chars using lowercase letters, digits, or underscores")

        if (is_valid_password(password) == False)
            return api_error(400, "Password must be between 6 and 72 characters")

        if (is_valid_bio(bio) == False)
            return api_error(400, "Bio must be 160 characters or fewer")

        if (find_user(username) != None)
            return api_error(409, "That username is already taken")

        joined_seq = next_sequence("users")
        created = users.insert_one({
            "_id": username_key(username),
            "username": username,
            "password_hash": auth_hash_password(password),
            "bio": bio,
            "joined_seq": joined_seq
        })
        str(created["inserted_id"])

        session.regenerate()
        session["username"] = username
        return app.json({
            "ok": True,
            "user": public_user_from_doc(find_user(username), username)
        })

    @app.post("/api/auth/login")
    fn login()
        username = text_or_empty(request_input("username"))
        password = text_or_empty(request_input("password"))

        if (username == "" || password == "")
            return api_error(400, "Username and password are required")

        user = find_user(username)

        if (user == None)
            return api_error(401, "Invalid username or password")

        if (auth_verify_password(password, text_or_empty(user["password_hash"])) == False)
            return api_error(401, "Invalid username or password")

        session.regenerate()
        session["username"] = username
        return app.json({
            "ok": True,
            "user": public_user_from_doc(user, username)
        })

    @app.post("/api/auth/logout")
    fn logout()
        session.destroy()
        return app.json({"ok": True})
