import {
  Body,
  Controller,
  Delete,
  Get,
  Param,
  Post,
  Put,
  Request,
  Res,
  UseGuards,
} from '@nestjs/common';
import type { Response, Request as ExpressRequest } from 'express';
import { SkipTransform } from '@common/decorators/skip-transform.decorator';
import { TemplatesService } from '../services/templates.service';
import { handleMeetingAttendanceError } from '../errors/handle-controller-error';

@Controller('meeting-attendance/templates')
@SkipTransform()
export class MeetingAttendanceTemplatesController {
  constructor(private readonly templatesService: TemplatesService) {}

  @Get()
  async listTemplates(@Request() req: ExpressRequest, @Res() res: Response) {
    try {
      const email = (req.user as { email?: string })?.email;
      if (!email) {
        return res.status(401).json({ error: 'Unauthorized access' });
      }

      const result = await this.templatesService.listTemplates(email);
      return res.status(200).json(result);
    } catch (error) {
      return handleMeetingAttendanceError(res, error, 'Server error');
    }
  }

  @Post()
  async createTemplate(
    @Body() body: Record<string, any>,
    @Request() req: ExpressRequest,
    @Res() res: Response,
  ) {
    try {
      const email = (req.user as { email?: string })?.email;
      if (!email) {
        return res.status(401).json({ error: 'Unauthorized access' });
      }

      const actor = req.user as any;
      const result = await this.templatesService.createTemplate(body, email, req, actor);
      return res.status(201).json(result);
    } catch (error) {
      return handleMeetingAttendanceError(res, error, 'Server error');
    }
  }

  @Post(':id/create-meeting')
  async createMeetingFromTemplate(
    @Param('id') id: string,
    @Body() body: Record<string, any>,
    @Request() req: ExpressRequest,
    @Res() res: Response,
  ) {
    try {
      const email = (req.user as { email?: string })?.email;
      if (!email) {
        return res.status(401).json({ error: 'Unauthorized access' });
      }

      const actor = req.user as any;
      const result = await this.templatesService.createMeetingFromTemplate(id, body, req, email, actor);
      return res.status(201).json(result);
    } catch (error) {
      return handleMeetingAttendanceError(res, error, 'Server error');
    }
  }

  @Put(':id')
  async updateTemplate(
    @Param('id') id: string,
    @Body() body: Record<string, any>,
    @Request() req: ExpressRequest,
    @Res() res: Response,
  ) {
    try {
      const email = (req.user as { email?: string })?.email;
      if (!email) {
        return res.status(401).json({ error: 'Unauthorized access' });
      }

      const actor = req.user as any;
      const result = await this.templatesService.updateTemplate(id, body, email, req, actor);
      return res.status(200).json(result);
    } catch (error) {
      return handleMeetingAttendanceError(res, error, 'Server error');
    }
  }

  @Delete(':id')
  async deleteTemplate(
    @Param('id') id: string,
    @Request() req: ExpressRequest,
    @Res() res: Response,
  ) {
    try {
      const email = (req.user as { email?: string })?.email;
      if (!email) {
        return res.status(401).json({ error: 'Unauthorized access' });
      }

      const actor = req.user as any;
      const result = await this.templatesService.deleteTemplate(id, email, req, actor);
      return res.status(200).json(result);
    } catch (error) {
      return handleMeetingAttendanceError(res, error, 'Server error');
    }
  }
}
