import {
  Body,
  Controller,
  Get,
  Param,
  Post,
  Put,
  Query,
  Req,
  UseGuards,
} from "@nestjs/common"
import { ApiBearerAuth, ApiQuery, ApiResponse, ApiTags } from "@nestjs/swagger"
import { AuthGuardMiddleware } from "src/middleware/auth-guard.middleware"
import { CreateKpiDto } from "./dto/create-kpi.dto"
import { KpiListFiltersDto } from "./dto/kpi-list-filters.dto"
import { MyMisFiltersDto } from "./dto/my-mis-filters.dto"
import { MyMisDto } from "./dto/my-mis.dto"
import { MisActionFiltersDto } from "./dto/mis-action-filters.dto"
import { MisActionDto } from "./dto/mis-action.dto"
import { MisService } from "./mis.service"

@Controller("mis")
@UseGuards(AuthGuardMiddleware)
@ApiBearerAuth("access-token")
@ApiTags("Mis")
export class MisController {
  constructor(private readonly misService: MisService) {}

  @Post("kpi")
  createKpi(@Body() body: CreateKpiDto, @Req() request: Request) {
    const token = request.headers["authorization"] || ""

    return this.misService.createKpi(body, token)
  }

  @Get("kpis")
  fetchAllKpis(@Query() query: KpiListFiltersDto, @Req() request: Request) {
    const token = request.headers["authorization"] || ""

    return this.misService.fetchAllKpis(query, token)
  }

  @Get("kpi/:id")
  fetchByKpiId(@Param("id") id: string, @Req() request: Request) {
    const token = request.headers["authorization"] || ""

    return this.misService.fetchByKpiId(+id, token)
  }

  @Put("kpi/:id")
  updateKpi(
    @Param("id") id: string,
    @Body() body: CreateKpiDto,
    @Req() request: Request,
  ) {
    const token = request.headers["authorization"] || ""

    return this.misService.updateKpi(+id, body, token)
  }

  // My MIS APIs
  @Get("my-mis")
  getMyMis(@Query() query: MyMisFiltersDto, @Req() request: Request) {
    const token = request.headers["authorization"] || ""

    return this.misService.getMyMis(query, token)
  }

  @Post("my-mis")
  @ApiResponse({
    status: 200,
    description:
      "MIS Report created or updated successfully. Returns the saved record with ID for frontend state management.",
    schema: {
      type: "object",
      properties: {
        success: { type: "boolean", example: true },
        message: { type: "string", example: "MIS Report added successfully" },
        data: {
          type: "object",
          properties: {
            id: { type: "number", example: 1 },
            month: { type: "number", example: 12 },
            year: { type: "number", example: 2024 },
            business_tasks: {
              type: "string",
              example: "Completed project analysis",
            },
            technical_tasks: {
              type: "string",
              example: "Implemented new features",
            },
            personal_tasks: {
              type: "string",
              example: "Attended training sessions",
            },
            status: { type: "string", example: "submitted" },
            employee_id: { type: "number", example: 1 },
            company_id: { type: "number", example: 1 },
            created_at: { type: "string", format: "date-time" },
            updated_at: { type: "string", format: "date-time" },
          },
        },
      },
    },
  })
  createOrUpdateMyMis(@Body() body: MyMisDto, @Req() request: Request) {
    const token = request.headers["authorization"] || ""

    return this.misService.createOrUpdateMyMis(body, token)
  }

  @Get("my-mis/:employeeId/details")
  @ApiQuery({
    name: "month",
    required: false,
    type: Number,
    description:
      "Filter by month (1-12). If provided with year and the period has passed, includes flag and feedback details.",
    example: 12,
  })
  @ApiQuery({
    name: "year",
    required: false,
    type: Number,
    description:
      "Filter by year. If provided with month and the period has passed, includes flag and feedback details.",
    example: 2024,
  })
  getMyMisDetails(
    @Param("employeeId") employeeId: string,
    @Req() request: Request,
    @Query("month") month?: number,
    @Query("year") year?: number,
  ) {
    const token = request.headers["authorization"] || ""

    return this.misService.getMyMisDetails(+employeeId, token, month, year)
  }

  // MIS Action APIs
  @Get("mis-action")
  getMisAction(@Query() query: MisActionFiltersDto, @Req() request: Request) {
    const token = request.headers["authorization"] || ""

    return this.misService.getMisAction(query, token)
  }

  @Post("mis-action")
  createOrUpdateMisAction(@Body() body: MisActionDto, @Req() request: Request) {
    const token = request.headers["authorization"] || ""

    return this.misService.createOrUpdateMisAction(body, token)
  }

  @Get("mis-action/:employeeId/details")
  @ApiQuery({
    name: "month",
    required: false,
    type: Number,
    description: "Filter by month (1-12)",
    example: 12,
  })
  @ApiQuery({
    name: "year",
    required: false,
    type: Number,
    description: "Filter by year",
    example: 2024,
  })
  getMisActionDetails(
    @Param("employeeId") employeeId: string,
    @Req() request: Request,
    @Query("month") month?: number,
    @Query("year") year?: number,
  ) {
    const token = request.headers["authorization"] || ""

    return this.misService.getMisActionDetails(+employeeId, token, month, year)
  }
}
