/**
 * Ledger Controller
 *
 * REST endpoints for Chart of Accounts (gnledger)
 * Replaces: LedgerProvider in original server
 */
import {
  Controller,
  Get,
  Post,
  Patch,
  Delete,
  Body,
  Param,
  Query,
  UseGuards,
} from '@nestjs/common';
import { LedgerService } from './ledger.service';
import { JwtAuthGuard } from '../auth/jwt-auth.guard';
import { CreateLedgerDto } from './dto/create-ledger.dto';
import { UpdateLedgerDto } from './dto/update-ledger.dto';

@Controller('ledger')
@UseGuards(JwtAuthGuard)
export class LedgerController {
  constructor(private ledgerService: LedgerService) {}

  /**
   * GET /api/ledger
   * Get all accounts (chart of accounts)
   * Query: actUp - children of parent (for tree)
   *        actCode - 1=sub, 2=main
   */
  @Get()
  findAll(
    @Query('actUp') actUp?: string,
    @Query('actCode') actCode?: string,
  ) {
    const code = actCode ? parseInt(actCode, 10) : undefined;
    return this.ledgerService.findAll(actUp, code);
  }

  /**
   * POST /api/ledger
   * Create a new account
   */
  @Post()
  create(@Body() dto: CreateLedgerDto) {
    return this.ledgerService.create(dto);
  }

  /**
   * GET /api/ledger/:actNo
   * Get single account by act_no
   * Query: actCode (optional) - filter by act_code
   */
  @Get(':actNo')
  findByActNo(
    @Param('actNo') actNo: string,
    @Query('actCode') actCode?: string,
  ) {
    const code = actCode ? parseInt(actCode, 10) : undefined;
    return this.ledgerService.findByActNo(actNo, code);
  }

  /**
   * PATCH /api/ledger/:actNo
   * Update an account
   */
  @Patch(':actNo')
  update(@Param('actNo') actNo: string, @Body() dto: UpdateLedgerDto) {
    return this.ledgerService.update(actNo, dto);
  }

  /**
   * DELETE /api/ledger/:actNo
   * Delete an account (fails if it has children)
   */
  @Delete(':actNo')
  remove(@Param('actNo') actNo: string) {
    return this.ledgerService.remove(actNo);
  }
}
