import type { HeadersFunction, LoaderFunctionArgs } from "react-router";
import { useLoaderData } from "react-router";
import { boundary } from "@shopify/shopify-app-react-router/server";
import { authenticate } from "../shopify.server";
import db from "../db.server";
import { moneyInr } from "../utils";

export const loader = async ({ request }: LoaderFunctionArgs) => {
  const { session } = await authenticate.admin(request);
  const [pending, collected, waived, all] = await Promise.all([
    db.deliveryOrder.aggregate({ _sum: { chargePaise: true }, _count: true, where: { shop: session.shop, status: "PENDING" } }),
    db.deliveryOrder.aggregate({ _sum: { chargePaise: true }, _count: true, where: { shop: session.shop, status: "COLLECTED" } }),
    db.deliveryOrder.aggregate({ _sum: { chargePaise: true }, _count: true, where: { shop: session.shop, status: "WAIVED" } }),
    db.deliveryOrder.count({ where: { shop: session.shop } }),
  ]);
  return { pending, collected, waived, all };
};

export default function Report() {
  const { pending, collected, waived, all } = useLoaderData<typeof loader>();
  return <div className="sb-page"><s-page heading="Delivery charge report"><div className="sb-grid sb-grid-4" style={{marginTop: 16}}><div className="sb-card"><div className="sb-label">Orders tracked</div><div className="sb-kpi">{all}</div></div><div className="sb-card"><div className="sb-label">Pending</div><div className="sb-kpi">{moneyInr(pending._sum.chargePaise || 0)}</div><div className="sb-muted">{pending._count} orders</div></div><div className="sb-card"><div className="sb-label">Collected</div><div className="sb-kpi">{moneyInr(collected._sum.chargePaise || 0)}</div><div className="sb-muted">{collected._count} orders</div></div><div className="sb-card"><div className="sb-label">Waived</div><div className="sb-kpi">{moneyInr(waived._sum.chargePaise || 0)}</div><div className="sb-muted">{waived._count} orders</div></div></div></s-page></div>;
}

export const headers: HeadersFunction = (headersArgs) => boundary.headers(headersArgs);
