import { Body, Controller, Get, Param, Patch, Post, Query, UseGuards } from '@nestjs/common';
import { ApiBearerAuth, ApiBody, ApiQuery, ApiTags } from '@nestjs/swagger';
import { JwtAuthGuard } from 'src/guards/jwt-auth.guard';
import { FeatureRequestService } from './service/feature-request.service';
import { Roles } from 'src/common/decorators/roles.decorator';
import { RolesGuard } from 'src/guards/roles.guard';
import { ResponseMessage } from 'src/common/decorators/response_message.decorator';
import { CurrentUser } from 'src/common/decorators/user.decorator';
import { IFullUser } from '../users/users.interface';
import { PaginatedQueryDto } from 'src/common/builder/QueryBuilder.dto';
import { ChangeFeatureRequestStatusDto, CreateFeatureRequestDto } from './feature-request.validation';
import { USER_ROLE } from '../users/users.constant';
import { IFeatureRequestStatus } from './feature-request.interface';

@ApiTags('User Feature Request')
@ApiBearerAuth()
@UseGuards(JwtAuthGuard)
@Controller('feature-request')
export class FeatureRequestController {

	constructor(
		private readonly featureRequestService: FeatureRequestService
	) { }

	@Get('all-feature-requests')
	@UseGuards(RolesGuard)
	@Roles(USER_ROLE.admin, USER_ROLE.super_admin)
	@ApiQuery({ type: PaginatedQueryDto })
	async getFeedbacks(
		@Query() query: Record<string, unknown>,
	) {
		return await this.featureRequestService.getAllFeatureRequests(query)
	}

	@Get('feature-request-by-id/:requestId')
	@UseGuards(RolesGuard)
	@Roles(USER_ROLE.admin, USER_ROLE.super_admin)
	async getFeedbackById(
		@Param('requestId') requestId: string,
	) {
		return await this.featureRequestService.getFeatureRequestById(requestId)
	}

	@Patch('change-status/:requestId')
	@UseGuards(RolesGuard)
	@Roles(USER_ROLE.super_admin)
	@ApiBody({ type: ChangeFeatureRequestStatusDto })
	async changeStatus(
		@Param('requestId') requestId: string,
		@Body() body: { status: IFeatureRequestStatus }
	) {
		await this.featureRequestService.updateRequestStatus(requestId, body)
		return { message: 'Status updated successfully' }
	}

	@Post('create-feature-request')
	@UseGuards(RolesGuard)
	@Roles(USER_ROLE.user, USER_ROLE.admin, USER_ROLE.super_admin)
	@ApiBody({ type: CreateFeatureRequestDto })
	@ResponseMessage("Feature request created successfully")
	async createFeatureRequest(
		@Body() payload: CreateFeatureRequestDto,
		@CurrentUser() user: IFullUser,
	) {
		return await this.featureRequestService.createFeatureRequest(payload, user);
	}

}
