/**
 * Daily Service
 *
 * Replaces: DoOneACDaily, UnDoOneACDaily, HoldACDaily, LastACDaily from TAmzServerImpl
 * Table: daily_tr (Accounting journal entries)
 */
import { Injectable } from '@nestjs/common';
import { PrismaService } from '../prisma/prisma.service';

@Injectable()
export class DailyService {
  constructor(private prisma: PrismaService) {}

  /**
   * Get last AC daily number for kind/ref
   * Maps to: LastACDaily(kind, ref) -> GetLastACDailyNo
   */
  async getLastACDailyNo(kind: number, ref: number): Promise<number> {
    const result = await this.prisma.dailyTr.aggregate({
      where: { kind, ref },
      _max: { tranNo: true },
    });
    const max = result._max.tranNo ?? 0;
    return max + 1;
  }

  /**
   * Hold (count) AC daily entries for kind/ref
   * Maps to: HoldACDaily(kind, ref)
   */
  async holdACDaily(kind: number, ref: number): Promise<number> {
    const count = await this.prisma.dailyTr.count({
      where: { kind, ref },
    });
    return count;
  }

  /**
   * Get daily entries for kind/ref
   */
  async getEntries(kind: number, ref: number, tranNo?: number) {
    const where: { kind: number; ref: number; tranNo?: number } = { kind, ref };
    if (tranNo !== undefined) {
      where.tranNo = tranNo;
    }
    return this.prisma.dailyTr.findMany({
      where,
      orderBy: [{ tranNo: 'asc' }, { tranSq: 'asc' }],
    });
  }

  /**
   * Last MG daily number - Maps to: LastMGDaily(kind, ref)
   */
  async getLastMGDailyNo(kind: number, ref: number): Promise<number> {
    const result = await this.prisma.mgdailyTr.aggregate({
      where: { kind, ref },
      _max: { tranNo: true },
    });
    const max = result._max.tranNo ?? 0;
    return max + 1;
  }

  /**
   * Hold MG daily - Maps to: HoldMGDaily(kind, ref)
   */
  async holdMGDaily(kind: number, ref: number): Promise<number> {
    return this.prisma.mgdailyTr.count({
      where: { kind, ref },
    });
  }
}
