package io.complyance.sdk.samples;

import io.complyance.sdk.Environment;
import io.complyance.sdk.GETSUnifySDK;
import io.complyance.sdk.SDKConfig;
import io.complyance.sdk.SDKException;
import io.complyance.sdk.Source;
import io.complyance.sdk.SourceType;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Complyance Java SDK - Purchase Invoice Retrieval Samples
 * Endpoint: https://dev.gets.complyance.io
 *
 * 1. Single purchase invoice retrieval
 * 2. Purchase invoice polling by date range
 * 3. Purchase invoice cursor polling
 */
public class PurchaseInvoiceRetrieval {

    private static final String API_KEY = System.getenv("COMPLYANCE_API_KEY");

    public static void main(String[] args) throws Exception {
        configureSdk();

        getSinglePurchaseInvoice();
        pollPurchaseInvoicesByDateRange();
        pollPurchaseInvoicesWithCursor();
    }

    private static void configureSdk() {
        List<Source> sources = Collections.singletonList(
            new Source("my-source", "1.0.0", SourceType.FIRST_PARTY)
        );

        SDKConfig config = new SDKConfig(API_KEY, Environment.SANDBOX, sources);
        GETSUnifySDK.configure(config);
    }

    private static void getSinglePurchaseInvoice() throws SDKException {
        String documentId = "01KT0SHAH3K21158AC72ZXVX4Z";
        Map<String, Object> result = GETSUnifySDK.getPurchaseInvoice(documentId);

        System.out.println("Document ID: " + result.get("documentId"));
        System.out.println("Country: " + result.get("country"));
        System.out.println("State: " + result.get("state"));
        System.out.println("Is Terminal: " + result.get("isTerminal"));

        @SuppressWarnings("unchecked")
        Map<String, Object> invoice = (Map<String, Object>) result.get("invoice");
        @SuppressWarnings("unchecked")
        Map<String, Object> header = invoice != null ? (Map<String, Object>) invoice.get("header") : null;
        @SuppressWarnings("unchecked")
        Map<String, Object> parties = invoice != null ? (Map<String, Object>) invoice.get("parties") : null;
        @SuppressWarnings("unchecked")
        Map<String, Object> seller = parties != null ? (Map<String, Object>) parties.get("seller") : null;
        @SuppressWarnings("unchecked")
        Map<String, Object> totals = invoice != null ? (Map<String, Object>) invoice.get("totals") : null;
        @SuppressWarnings("unchecked")
        Map<String, Object> compliance = (Map<String, Object>) result.get("compliance");

        System.out.println("Invoice Number: " + (header != null ? header.get("documentNumber") : null));
        System.out.println("Supplier: " + (seller != null ? seller.get("name") : null));
        System.out.println("Total (incl. tax): " + (totals != null ? totals.get("totalAmountIncludingTax") : null));
        System.out.println("Compliance UUID: " + (compliance != null ? compliance.get("uuid") : null));
    }

    private static void pollPurchaseInvoicesByDateRange() throws SDKException {
        Map<String, String> filters = new HashMap<>();
        filters.put("from", "2026-06-01");
        filters.put("to", "2026-06-08");
        filters.put("limit", "5");

        Map<String, Object> result = GETSUnifySDK.listPurchaseInvoices(filters);

        @SuppressWarnings("unchecked")
        Map<String, Object> data = (Map<String, Object>) result.get("data");
        @SuppressWarnings("unchecked")
        List<Map<String, Object>> items = data != null
            ? (List<Map<String, Object>>) data.get("items")
            : Collections.emptyList();

        System.out.println("Items found: " + items.size());
        System.out.println("Has more: " + (data != null ? data.get("hasMore") : null));

        for (Map<String, Object> item : items) {
            System.out.println(
                "- " + item.get("documentId")
                + " " + item.get("invoiceNumber")
                + " " + item.get("supplierName")
            );
        }
    }

    private static void pollPurchaseInvoicesWithCursor() throws SDKException {
        Map<String, String> filters = new HashMap<>();
        filters.put("from", "2026-06-01");
        filters.put("limit", "100");

        Map<String, Object> firstPage = GETSUnifySDK.listPurchaseInvoices(filters);

        @SuppressWarnings("unchecked")
        Map<String, Object> data = (Map<String, Object>) firstPage.get("data");
        @SuppressWarnings("unchecked")
        List<Map<String, Object>> items = data != null
            ? (List<Map<String, Object>>) data.get("items")
            : Collections.emptyList();
        String nextCursor = data != null ? (String) data.get("nextCursor") : null;

        System.out.println("First page items: " + items.size());
        System.out.println("Next cursor: " + nextCursor);

        if (nextCursor != null && !nextCursor.isEmpty()) {
            Map<String, String> cursorFilters = new HashMap<>();
            cursorFilters.put("from", "2026-06-01");
            cursorFilters.put("limit", "100");
            cursorFilters.put("cursor", nextCursor);

            Map<String, Object> nextPage = GETSUnifySDK.listPurchaseInvoices(cursorFilters);

            @SuppressWarnings("unchecked")
            Map<String, Object> nextData = (Map<String, Object>) nextPage.get("data");
            @SuppressWarnings("unchecked")
            List<Map<String, Object>> nextItems = nextData != null
                ? (List<Map<String, Object>>) nextData.get("items")
                : Collections.emptyList();

            System.out.println("Next page items: " + nextItems.size());
            System.out.println("Has more: " + (nextData != null ? nextData.get("hasMore") : null));
        }
    }
}
