##### Mission Recon

Congrats! The web client is successfully running. Make sure the database and API work as well before starting the challenge.

Take a look through the codebase to find out how things currently work and submit your solution and your suggested improvements. Solve the main challenge first and then all of the bonus problems.

In order to have the greatest chance of success, please take note of the following:

- Make sure the overall feature works; it's more important to prove the concept than to spend all your time on a specific detail
- Logical correctness is the most important aspect
- We will also evaluate the code for quality aspects
- Some functional details are underspecified on purpose so you can implement some of them at your initiative if you have time

##### Main Challenge

You are working on an app used in an expensive robots shop. The existing functionality helps us keep track of all the robots we are currently trying to sell, and the staff members who are experts in each type of robot. You can only update the name and the price of a robot from the UI, but with some skills, you can do a whole lot more.

We are starting to get a lot of calls from clients interested in our robots, and it's hard to keep track of things. We need a new module that allows us to gather information about the client's interest, and allocate them to the staff members in a way that maximizes our chances of selling all the robots.

Some clients know exactly what they want, others are just testing the waters. Nevertheless, we want our staff members to engage with all of them.

You need to implement a new page where we can fill in the information gathered from the client.

- Client information: name, email, phone number, address, notes
- General interest: hardware type, brand, autonomy, weight, price range (e.g. Cleaning robot, RobotFactory, 48 hours, 2 kg, $500 - $1000)
- Optional features that can sometimes make the difference (e.g. knows how to dance, makes good breakfast, etc.)

Upon saving the form, you need to allocate the client to the staff member who has the highest chance of finding a robot for them. Use the following rules to find this match. Keep in mind that these rules might change quite often as we experiment with different approaches.

- Pick the staff member who has knowledge in the biggest number of robots that strictly match the general requirements of the client (e.g. if a robot is cheaper or more expensive than what the client requested, it should not be considered as a match)
- If there is a tie between two or more staff members, pick the one staff who has the biggest average count of optional features for the matching robots
- If there is still a tie, pick the one staff who has the biggest average price for the matching robots
- If there is still a tie, pick at random one of these staff members

##### Bonus

1. Fix the performance issues on the existing pages.
2. Create migrations for the existing database schema.
3. Increase the test coverage as much as you can.