import { Controller, Get, Body, Patch, Param, Delete, UseGuards, Query } from '@nestjs/common';
import { UserAnalyticsService } from './user-analytics.service';
import { UpdateUserAnalyticDto } from './user-analytics.validation';
import { ResponseMessage } from 'src/common/decorators/response_message.decorator';
import { ApiBearerAuth, ApiQuery, ApiTags } from '@nestjs/swagger';
import { JwtAuthGuard } from 'src/guards/jwt-auth.guard';
import { RolesGuard } from 'src/guards/roles.guard';
import { Roles } from 'src/common/decorators/roles.decorator';
import { USER_ROLE } from '../users/users.constant';
import { CurrentUser } from 'src/common/decorators/user.decorator';
import { IUser } from '../users/users.interface';
import moment from 'moment-timezone';
import { ValidateMongoId } from 'src/common/exception-filters/mongodbId.filters';

@ApiTags('User Analytics')
@Controller('user-analytics')
@ApiBearerAuth()
@UseGuards(JwtAuthGuard, RolesGuard)
export class UserAnalyticsController {
	constructor(private readonly userAnalyticsService: UserAnalyticsService) { }

	// @Get('get-all')
	// @Roles(USER_ROLE.admin)
	// @ResponseMessage('Successfully fetched all user analytics')
	// findAll() {
	// 	return this.userAnalyticsService.findAll();
	// }

	// @Get('get-by-user/:userId')
	// @Roles(USER_ROLE.admin)
	// findOne(@Param('userId') userId: string) {
	// 	return this.userAnalyticsService.findOneByUser(userId);
	// }

	@Get('/:userId')
	@Roles(USER_ROLE.admin, USER_ROLE.super_admin)
	@ApiQuery({ name: 'startDate', required: false, example: moment().tz('UTC').subtract(6, 'days').format('YYYY-MM-DD') })
	@ApiQuery({ name: 'endDate', required: false, example: moment().tz('UTC').format('YYYY-MM-DD') })
	async getUserAnalytics(
		@Param('userId', ValidateMongoId) userId: string,
		// default last 7 days
		@Query('startDate') startDate: string = moment().tz('UTC').subtract(6, 'days').format('YYYY-MM-DD'),
		@Query('endDate') endDate: string = moment().tz('UTC').format('YYYY-MM-DD')
	) {
		return await this.userAnalyticsService.getUserAnalytics({ userId, startDate, endDate })
	}

	// @Get('get-by-id/:id')
	// @Roles(USER_ROLE.admin)
	// findOneById(@Param('id') id: string) {
	// 	return this.userAnalyticsService.findById(id);
	// }

	@Get('get-my-analytics')
	@Roles(USER_ROLE.admin, USER_ROLE.user)
	@ResponseMessage('Successfully fetched user analytics')
	findMyAnalytics(
		@CurrentUser() user: IUser
	) {
		return this.userAnalyticsService.findOneByUser(user._id);
	}


	@Patch('update-by-user/:userId')
	@Roles(USER_ROLE.admin)
	update(@Param('userId') userId: string, @Body() updateUserAnalyticDto: UpdateUserAnalyticDto) {
		return this.userAnalyticsService.updateByuser(userId, updateUserAnalyticDto);
	}

	@Patch('update-by-id/:id')
	@Roles(USER_ROLE.admin)
	updateById(@Param('id') id: string, @Body() updateUserAnalyticDto: UpdateUserAnalyticDto) {
		return this.userAnalyticsService.updateById(id, updateUserAnalyticDto);
	}
}
