import { Controller, Param, Body, Get, Post, Delete, Patch } from "@nestjs/common";

import { SchedulePresetsCreateService } from "src/time-and-attendance/schedule-presets/services/schedule-presets-create.service";
import { SchedulePresetUpdateService } from "src/time-and-attendance/schedule-presets/services/schedule-presets-update.service";
import { SchedulePresetDeleteService } from "src/time-and-attendance/schedule-presets/services/schedule-presets-delete.service";
import { SchedulePresetsGetService } from "src/time-and-attendance/schedule-presets/services/schedule-presets-get.service";
import { SchedulePresetsDto } from "src/time-and-attendance/schedule-presets/schedule-presets.dto";

import { ModuleAccessAllowed } from "src/common/decorators/modules-guard.decorators";
import { Modules as ModulesEnum } from "prisma/postgres/generated/prisma/client/postgres/client";
import { Access } from "src/common/decorators/module-access.decorators";
import { SchedulePresetsApplyService } from "src/time-and-attendance/schedule-presets/services/schedule-presets-apply.service";

@Controller('schedule-presets')
export class SchedulePresetsController {
    constructor(
        private readonly getService: SchedulePresetsGetService,
        private readonly createService: SchedulePresetsCreateService,
        private readonly updateService: SchedulePresetUpdateService,
        private readonly deleteService: SchedulePresetDeleteService,
        private readonly applyService: SchedulePresetsApplyService,
    ) { }

    @Get('find-list')
    @ModuleAccessAllowed(ModulesEnum.employee_management)
    async findListById() {
        return this.getService.getSchedulePresets();
    }

    @Post('create')
    @ModuleAccessAllowed(ModulesEnum.employee_management)
    async createPreset(@Body() dto: SchedulePresetsDto) {
        return await this.createService.createPreset(dto);
    }

    @Patch('update')
    @ModuleAccessAllowed(ModulesEnum.employee_management)
    async updatePreset(
        @Body() dto: SchedulePresetsDto) {
        return await this.updateService.updatePreset(dto);
    }

    @Delete('delete/:id')
    @ModuleAccessAllowed(ModulesEnum.employee_management)
    async deletePreset(
        @Param('id') id: number) {
        return await this.deleteService.deletePreset(id);
    }

    @Post('apply-preset')
    @ModuleAccessAllowed(ModulesEnum.timesheets)
    async applyPresetToTimesheet(
        @Access('email') email: string, 
        @Body('timesheet_id') timesheet_id: number,
    ) {
        return await this.applyService.applyPresetToTimesheet(email, timesheet_id);
    }

    @Post('apply-preset/:email')
    @ModuleAccessAllowed(ModulesEnum.timesheets_approval)
    async applyPresetToTimesheetFromApproval(
        @Access('email') email: string, 
        @Body('timesheet_id') timesheet_id: number,
        @Param('email') employee_email: string,
    ) {
        return await this.applyService.applyPresetToTimesheet(email, timesheet_id, employee_email);
    }

    @Post('apply-day-preset')
    @ModuleAccessAllowed(ModulesEnum.timesheets)
    async applyPresetToDay(
        @Access('email') email: string,
        @Body('timesheet_id') timesheet_id: number,
        @Body('week_day_index') week_day_index: number,
        @Body('date') date: string,
    ) {
        return await this.applyService.applyPresetToDay(email, timesheet_id, week_day_index, date);
    }

    @Post('apply-day-preset/:email')
    @ModuleAccessAllowed(ModulesEnum.timesheets_approval)
    async applyPresetToDayFromApproval(
        @Access('email') email: string,
        @Body('timesheet_id') timesheet_id: number,
        @Body('week_day_index') week_day_index: number,
        @Body('date') date: string,
        @Param('email') employee_email: string,
    ) {
        return await this.applyService.applyPresetToDay(email, timesheet_id, week_day_index, date, employee_email);
    }
}