Craft for Author Agency website?
Don't be alarmed if this post gets flagged for being off-topic. Typically questions regarding whether "craft is appropriate for x" are considered too broad and opinion based. But I'll try and give you some suggestions anyway, which may give you a head start.

The short answer is yes, craft can do all those things. The only point to maybe consider is when you say "purchase", unless you are just linking to amazon or something. As I'm sure you're aware, E-commerce is not something to take lightly and I would make sure you research your options here, and have a plan. E-commerce solutions for craft are limited at the moment, but keep an eye on the plugin page.

You will likely want to have Craft Pro, so that you can have multiple user accounts.

Here is one approach to the basic CMS design, without really knowing anything about your requirements.


Create a single for your homepage.
Create a 'structure' (call it "pages" for example, or whatever you like) to contain all of your static pages and index/landing pages. This would include for example pages like "About us", "Company", "Services", "Authors" index page, "Books" index page, and anything else that you would consider as part of your main nav. 'Entries' within this structure would be defined with unique 'Entry Types' for each unique page layout that you need. Within each 'Entry Type' fields can be defined independently from other 'Entry Types'. In the 'pages/_entry.html' template you can determine which template code to display by checking the entry.type property. The advantage of using a structure here (as apposed to channels and singles) is that you can use it to generate dynamic navigation. See example below.
Create a channel for Authors (called 'authors' or whatever). You can also create users for this if you ever want to allow clients to log-in for whatever reason. (Note: I would use a channel regardless because it allows for multiple tabs in the edit page, and link it to users via a users field. But that's just me). Another tip: Might also check out a plugin called Introvert to display reverse related books from the books channel.
Create a channel for Books (called 'books' or 'products' or whatever), with a 'related users' or 'related entries' field for 'authors' (depending on how you dealt with authors above).
Create a category group for your books subject taxonomies (I'm just guessing at this point), but you get the idea.
Add salt and pepper to taste and serve.


Now for some code examples (and useful concepts regardless of your design).

In your '_layout.html' master template, to generate nav (copied from the docs):

{% set entries = craft.entries.section('pages') %}
&lt;ul id="nav"&gt;
    {% nav entry in entries %}
        &lt;li&gt;
            &lt;a href="{{ entry.url }}"&gt;{{ entry.title }}&lt;/a&gt;
            {% ifchildren %}
                &lt;ul&gt;
                    {% children %}
                &lt;/ul&gt;
            {% endifchildren %}
        &lt;/li&gt;
    {% endnav %}
&lt;/ul&gt;


In your 'pages/_entry.html' template, to determine the entry type and retrieve related entries:

{% switch entry.type %}
    {% case 'about' %}
        {{ entry.title }}
        ...
    {% case 'authors' %}
        {{ entry.title }}
        ...
        &lt;ul&gt;
            {% set authors = craft.entries.section('authors') %}
            {% for author in authors %}
                &lt;li&gt;&lt;a href="{{ author.url }}"&gt;&lt;/a&gt;{{ author.firstName }} {{ author.lastName }}&lt;/li&gt;
            {% endfor %}
        &lt;/ul&gt; 
    {% case 'books' %}
        {# repeat code above but for books, likely with some category break-down based on the categories field #}
    {% case default %}
        {# display default template #}
{% endswitch %}


Note: You can also use 'includes' in the switch statement, for better template organization, or use this technique to eliminate the need for the 'switch' statement altogether.

In your 'authors/_entry.html' template, to get related books.

&lt;h1&gt;{{ entry.title }}&lt;/h1&gt;
&lt;p&gt;
   &lt;img src="{{ entry.headshot.first.url }}" /&gt;
   {{ entry.bio }}
   ...
&lt;/p&gt;
&lt;h2&gt;Books&lt;/h2&gt;
&lt;ul&gt;
    {% set books = craft.entries.section('books').relatedTo(entry) %}
    {% for book in books %}
        &lt;li&gt;
            {{ book.title }}&lt;br&gt;
            &lt;img src="{{ book.coverPhoto.first.url }}" /&gt;
        &lt;/li&gt;
    {% endfor %}
&lt;/ul&gt;


In your 'books/_entry.html' template, to get authors from the 'authors' entries field.

&lt;h1&gt;{{ entry.title }}&lt;/h1&gt;
&lt;img src="{{ entry.coverPhoto.first.url }}" /&gt;
....
&lt;h2&gt;Authors&lt;/h2&gt;
&lt;ul&gt;
    {% for author in entry.authors %}
        &lt;li&gt;{{ author.title }}&lt;/li&gt;
    {% endfor %}
&lt;/ul&gt;