import {
  Body,
  Controller,
  Delete,
  Get,
  HttpCode,
  HttpStatus,
  Param,
  ParseIntPipe,
  Patch,
  Post,
  Query,
} from '@nestjs/common';

import { CreateIndicatorDto } from './dto/create-indicator.dto';
import { QueryIndicatorDto } from './dto/query-indicator.dto';
import { UpdateIndicatorDto } from './dto/update-indicator.dto';
import { IndicatorsService } from './indicators.service';

type ApiResponse<T> = {
  success: boolean;
  statusCode: number;
  message: string;
  data: T;
};

@Controller('indicators')
export class IndicatorsController {
  constructor(private readonly indicatorsService: IndicatorsService) {}

  @Post()
  async create(@Body() dto: CreateIndicatorDto): Promise<ApiResponse<unknown>> {
    const data: unknown = await this.indicatorsService.create(dto);

    return {
      success: true,
      statusCode: HttpStatus.CREATED,
      message: 'Indicator created successfully',
      data,
    };
  }

  @Get('options')
  async findOptions(
    @Query('search') search?: string,
  ): Promise<ApiResponse<unknown>> {
    const data: unknown = await this.indicatorsService.findOptions(search);

    return {
      success: true,
      statusCode: HttpStatus.OK,
      message: 'Indicator options retrieved successfully',
      data,
    };
  }

  @Get()
  async findAll(
    @Query() query: QueryIndicatorDto,
  ): Promise<ApiResponse<unknown>> {
    const data: unknown = await this.indicatorsService.findAll(query);

    return {
      success: true,
      statusCode: HttpStatus.OK,
      message: 'Indicators retrieved successfully',
      data,
    };
  }

  @Get(':id')
  async findOne(
    @Param('id', ParseIntPipe) id: number,
  ): Promise<ApiResponse<unknown>> {
    const data: unknown = await this.indicatorsService.findOne(id);

    return {
      success: true,
      statusCode: HttpStatus.OK,
      message: 'Indicator retrieved successfully',
      data,
    };
  }

  @Patch(':id')
  async update(
    @Param('id', ParseIntPipe) id: number,
    @Body() dto: UpdateIndicatorDto,
  ): Promise<ApiResponse<unknown>> {
    const data: unknown = await this.indicatorsService.update(id, dto);

    return {
      success: true,
      statusCode: HttpStatus.OK,
      message: 'Indicator updated successfully',
      data,
    };
  }

  @Delete(':id')
  @HttpCode(HttpStatus.OK)
  async remove(
    @Param('id', ParseIntPipe) id: number,
  ): Promise<ApiResponse<unknown>> {
    const data: unknown = await this.indicatorsService.remove(id);

    return {
      success: true,
      statusCode: HttpStatus.OK,
      message: 'Indicator deleted successfully',
      data,
    };
  }

  @Patch(':id/restore')
  async restore(
    @Param('id', ParseIntPipe) id: number,
  ): Promise<ApiResponse<unknown>> {
    const data: unknown = await this.indicatorsService.restore(id);

    return {
      success: true,
      statusCode: HttpStatus.OK,
      message: 'Indicator restored successfully',
      data,
    };
  }
}
