import {
  Controller,
  Get,
  Post,
  Put,
  Delete,
  Body,
  Param,
  Query,
  ParseIntPipe,
  UseGuards,
} from '@nestjs/common';
import { ExpensesService } from './expenses.service';
import { CreateExpenseDto } from './dto/create-expense.dto';
import { UpdateExpenseDto } from './dto/update-expense.dto';
import { CreateFixedExpenseDto } from './dto/create-fixed-expense.dto';
import { UpdateFixedExpenseDto } from './dto/update-fixed-expense.dto';
import { CreateCategoryDto } from './dto/create-category.dto';
import { PaginationDto } from '../../common/dto/pagination.dto';
import { JwtAuthGuard } from '../../common/guards/jwt-auth.guard';
import { CurrentUser } from '../../common/decorators/current-user.decorator';

@Controller('expenses')
@UseGuards(JwtAuthGuard)
export class ExpensesController {
  constructor(private readonly expensesService: ExpensesService) {}

  @Get()
  findAll(
    @CurrentUser() user: { id: number; email: string },
    @Query()
    query: PaginationDto & {
      categoryId?: string;
      startDate?: string;
      endDate?: string;
    },
  ) {
    return this.expensesService.findAll(user.id, query);
  }

  // ========================
  // Categories
  // ========================

  @Get('categories')
  getCategories(@CurrentUser() user: { id: number; email: string }) {
    return this.expensesService.getCategories(user.id);
  }

  @Post('categories')
  createCategory(
    @CurrentUser() user: { id: number; email: string },
    @Body() dto: CreateCategoryDto,
  ) {
    return this.expensesService.createCategory(user.id, dto);
  }

  @Delete('categories/:id')
  deleteCategory(
    @CurrentUser() user: { id: number; email: string },
    @Param('id', ParseIntPipe) id: number,
  ) {
    return this.expensesService.deleteCategory(user.id, id);
  }

  // ========================
  // Fixed Expenses
  // ========================

  @Get('fixed')
  getFixedExpenses(@CurrentUser() user: { id: number; email: string }) {
    return this.expensesService.getFixedExpenses(user.id);
  }

  @Post('fixed')
  createFixedExpense(
    @CurrentUser() user: { id: number; email: string },
    @Body() dto: CreateFixedExpenseDto,
  ) {
    return this.expensesService.createFixedExpense(user.id, dto);
  }

  @Put('fixed/:id')
  updateFixedExpense(
    @CurrentUser() user: { id: number; email: string },
    @Param('id', ParseIntPipe) id: number,
    @Body() dto: UpdateFixedExpenseDto,
  ) {
    return this.expensesService.updateFixedExpense(user.id, id, dto);
  }

  @Delete('fixed/:id')
  deleteFixedExpense(
    @CurrentUser() user: { id: number; email: string },
    @Param('id', ParseIntPipe) id: number,
  ) {
    return this.expensesService.deleteFixedExpense(user.id, id);
  }

  // ========================
  // Summary
  // ========================

  @Get('summary')
  getMonthlySummary(
    @CurrentUser() user: { id: number; email: string },
    @Query('year') year: string,
    @Query('month') month: string,
  ) {
    const y = year ? Number(year) : new Date().getFullYear();
    const m = month ? Number(month) : new Date().getMonth() + 1;
    return this.expensesService.getMonthlySummary(user.id, y, m);
  }

  // ========================
  // Expenses CRUD
  // ========================

  @Get(':id')
  findOne(
    @CurrentUser() user: { id: number; email: string },
    @Param('id', ParseIntPipe) id: number,
  ) {
    return this.expensesService.findOne(user.id, id);
  }

  @Post()
  create(
    @CurrentUser() user: { id: number; email: string },
    @Body() dto: CreateExpenseDto,
  ) {
    return this.expensesService.create(user.id, dto);
  }

  @Put(':id')
  update(
    @CurrentUser() user: { id: number; email: string },
    @Param('id', ParseIntPipe) id: number,
    @Body() dto: UpdateExpenseDto,
  ) {
    return this.expensesService.update(user.id, id, dto);
  }

  @Delete(':id')
  remove(
    @CurrentUser() user: { id: number; email: string },
    @Param('id', ParseIntPipe) id: number,
  ) {
    return this.expensesService.remove(user.id, id);
  }
}
