-- name: CreateClient :exec
INSERT INTO clients (clientId, name) VALUES ($1, $2);

-- name: GetClient :one
SELECT * FROM fullClients WHERE clientId = $1;

-- name: ListClients :many
-- Returns all clients ordered by name
SELECT * FROM fullClients ORDER BY name;

-- name: UpdateClient :exec
UPDATE clients SET name = $1 WHERE clientId = $2;

-- name: AddClientCanSync :exec
INSERT INTO clientCanSync (canSync, clientId) VALUES ($1, $2);

-- name: IsClientSynced :one
-- Query functionality has been removed. A client is considered synced when
-- all documents have completed text extraction (or failed with explicit failure).
-- See remove_query_plan.md for details.
WITH
docs AS (
    -- Get all documents for this client
    SELECT id, clientId FROM documents WHERE clientId = $1
),
doc_clean_entries as (
    -- Documents with their current clean entries
    SELECT
        d.id AS document_id,
        d.clientId as client_id,
        cte.id AS clean_entry_id,
        cte.fail as clean_fail
    FROM
        docs d
        LEFT JOIN currentCleanEntries cte ON cte.documentId = d.id
),
doc_text_entries AS (
    -- Documents with their current text entries
    SELECT
        d.document_id,
        cte.id AS text_entry_id,
        d.clean_entry_id,
        d.clean_fail,
        d.client_id
    FROM
        doc_clean_entries d
        LEFT JOIN currentTextEntries cte ON cte.cleanId = d.clean_entry_id
)
SELECT (
    -- No documents means client is synced
    NOT EXISTS (SELECT 1 FROM docs)

    OR

    -- All documents have completed processing (clean entry exists and either
    -- text entry exists or clean failed)
    NOT EXISTS (
        SELECT 1 FROM doc_text_entries
        where clean_entry_id is null or
        (clean_fail is null and text_entry_id is null)
    )
)::bool as is_synced;
