import { CustomerRepository } from "../repositories/CustomerRepository.js";
import { PurchaseRepository } from "../repositories/PurchaseRepository.js";
import { SupplierRepository } from "../repositories/SupplierRepository.js";
import { SaleRepository } from "../repositories/SaleRepository.js";
import { ExpenseRepository } from "../repositories/ExpenseRepository.js";
import { RetailSaleService } from "./RetailSaleService.js";
import { AttendanceRepository } from "../repositories/AttendanceRepository.js";

export class DashboardService {
    constructor(
        private readonly customerRepository = new CustomerRepository(),
        private readonly purchaseRepository = new PurchaseRepository(),
        private readonly supplierRepository = new SupplierRepository(),
        private readonly saleRepository = new SaleRepository(),
        private readonly expenseRepository = new ExpenseRepository(),
        private readonly retailSaleService = new RetailSaleService(),
        private readonly attendanceRepository = new AttendanceRepository()) { }

    async getTodaysAttendance() {
        const todayStr = new Date().toISOString().split("T")[0] as string;
        return this.attendanceRepository.getSummary(todayStr);
    }

    // ── Stat Cards ────────────────────────────────────────────────────────────

    async getTotalCustomers(): Promise<number> {
        return this.customerRepository.activeCustomerCount();
    }

    async getTotalSellers(): Promise<number> {
        return this.supplierRepository.activeSupplierCount();
    }

    async getTodaysPurchaseAmount(): Promise<number> {
        return this.purchaseRepository.todayPurchaseTotalAmount();
    }

    async getTodaysSalesAmount(): Promise<number> {
        const wholesaleAmount = await this.saleRepository.getTodaySalesAmount();
        const movedRetailAmount = await this.retailSaleService.getTodayMovedToWholesaleAmount();
        return Number(wholesaleAmount) + Number(movedRetailAmount);
    }

    async getTodaysExpensesAmount(): Promise<number> {
        return this.expenseRepository.todayExpensesTotal();
    }

    async getTodaysRetailSalesAmount(): Promise<number> {
        return this.retailSaleService.getTodayRetailSalesAmount();
    }

    // ── Today's Profit (arrival-aware) ───────────────────────────────────────

    async getTodaysProfit(): Promise<number> {
        const [wholesaleProfit, movedRetailProfit] = await Promise.all([
            this.saleRepository.getTodaysWholesaleProfit(),
            this.retailSaleService.getTodayMovedToWholesaleProfit(),
        ]);
        return Math.round((wholesaleProfit + movedRetailProfit) * 100) / 100;
    }

    // ── 7-day Sales & Profit Chart ────────────────────────────────────────────

    async getSalesProfitChart() {
        const wholesaleChart = await this.saleRepository.getSalesProfitChart();
        const movedRetailChart = await this.retailSaleService.getMovedToWholesaleProfitChart();

        return wholesaleChart.map((wsDay, index) => {
            const msDay = movedRetailChart[index];
            return {
                day: wsDay.day,
                sales: wsDay.sales + (msDay?.sales || 0),
                profit: Math.round((wsDay.profit + (msDay?.profit || 0)) * 100) / 100,
            };
        });
    }

    // ── Outstanding Accounts ─────────────────────────────────────────────────

    async getPendingVendorPayments(): Promise<number> {
        return this.supplierRepository.getTotalOutstandingBalance();
    }

    async getPendingCustomerReceipts(): Promise<number> {
        return this.customerRepository.getTotalOutstandingBalance();
    }

    async getVendorPaymentsBreakdown() {
        return this.supplierRepository.getVendorPaymentsBreakdown();
    }

    async getCustomerReceiptsBreakdown() {
        return this.customerRepository.getCustomerReceiptsBreakdown();
    }

    // ── Vegetable Stock ───────────────────────────────────────────────────────

    async getVegetableStock() {
        return this.purchaseRepository.getVegetableStock();
    }

    // ── Top Demanded Vegetables ───────────────────────────────────────────────

    async getTopDemandedVegetables() {
        return this.saleRepository.getTopDemandedVegetables();
    }

    // ── Recent Sales Activity ─────────────────────────────────────────────────

    async getRecentSales() {
        const wholesaleRecent = await this.saleRepository.getRecentSales();
        const movedRetailRecent = await this.retailSaleService.getRecentMovedToWholesaleSales();
        
        const combined = [...wholesaleRecent, ...movedRetailRecent];
        
        // Sort by createdAt desc
        combined.sort((a, b) => {
            const dateA = (a as any).createdAt ? new Date((a as any).createdAt).getTime() : 0;
            const dateB = (b as any).createdAt ? new Date((b as any).createdAt).getTime() : 0;
            return dateB - dateA;
        });

        // Return top 5, removing createdAt
        return combined.slice(0, 5).map(({ invoiceNo, customer, amount, status, date }) => ({
            invoiceNo,
            customer,
            amount,
            status,
            date,
        }));
    }
}