import {
  Controller,
  Get,
  Post,
  Body,
  Patch,
  Param,
  Delete,
  UseGuards,
  Req,
  Res,
  Query,
} from "@nestjs/common";
import { MacrosService } from "./macros.service";
import { CreateMacroLogDto } from "./dto/create-macro.dto";
import { UpdateMacroDto } from "./dto/update-macro.dto";
import { SetTargetMacroDto } from "./dto/set-target-macro.dto";
import { UserAuthGuard } from "src/common/guards/jwt-auth.guard";
import { Request, Response } from "express";
import { UserDecorator } from "src/common/decorator/user.decorator";
import { ApiBearerAuth, ApiTags } from "@nestjs/swagger";

@ApiTags("Macros")
@ApiBearerAuth()
@Controller("macros")
export class MacrosController {
  constructor(private readonly macrosService: MacrosService) {}

  // POST /macros — create or upsert macro log for a date
  @UseGuards(UserAuthGuard)
  @Post()
  async create(
    @Body() dto: CreateMacroLogDto,
    @Req() req: Request,
    @Res() res: Response,
    @UserDecorator() user: any,
  ) {
    return this.macrosService.create(dto, req, res, user);
  }

  // GET /macros?date=YYYY-MM-DD — get macro log for a specific date
  @UseGuards(UserAuthGuard)
  @Get()
  async getByDate(
    @Query("date") date: string,
    @Req() req: Request,
    @Res() res: Response,
    @UserDecorator() user: any,
  ) {
    return this.macrosService.getByDate(date, req, res, user);
  }

  // GET /macros/weekly?weekStart=YYYY-MM-DD — get all logs for a 7-day window
  @UseGuards(UserAuthGuard)
  @Get("weekly")
  async getWeekly(
    @Query("weekStart") weekStart: string,
    @Req() req: Request,
    @Res() res: Response,
    @UserDecorator() user: any,
  ) {
    return this.macrosService.getWeekly(weekStart, req, res, user);
  }

  // PATCH /macros/:id — update a specific macro log by its _id
  @UseGuards(UserAuthGuard)
  @Patch(":id")
  async update(
    @Param("id") id: string,
    @Body() dto: UpdateMacroDto,
    @Req() req: Request,
    @Res() res: Response,
    @UserDecorator() user: any,
  ) {
    return this.macrosService.update(id, dto, req, res, user);
  }

  // DELETE /macros/:id — soft delete a macro log
  @UseGuards(UserAuthGuard)
  @Delete(":id")
  async remove(
    @Param("id") id: string,
    @Req() req: Request,
    @Res() res: Response,
    @UserDecorator() user: any,
  ) {
    return this.macrosService.remove(id, req, res, user);
  }

  // GET /macros/overview?date=YYYY-MM-DD — macro fulfillment for a day (consumed vs target)
  @UseGuards(UserAuthGuard)
  @Get("overview")
  async getOverview(
    @Query("date") date: string,
    @Req() req: Request,
    @Res() res: Response,
    @UserDecorator() user: any,
  ) {
    return this.macrosService.getOverview(date, req, res, user);
  }
  
  // POST /macros/target — set or update nutrition targets
  @UseGuards(UserAuthGuard)
  @Post("target")
  async setTarget(
    @Body() dto: SetTargetMacroDto,
    @Req() req: Request,
    @Res() res: Response,
    @UserDecorator() user: any,
  ) {
    return this.macrosService.setTarget(dto, req, res, user);
  }

  // GET /macros/target — get current nutrition targets
  @UseGuards(UserAuthGuard)
  @Get("target")
  async getTarget(
    @Req() req: Request,
    @Res() res: Response,
    @UserDecorator() user: any,
  ) {
    return this.macrosService.getTarget(req, res, user);
  }
}
