import {
  Controller,
  Get,
  Post,
  Body,
  Patch,
  Param,
  Delete,
  Query,
  UseInterceptors,
  UploadedFile,
  UseGuards,
  Req,
} from '@nestjs/common';
import { LanguagesService } from './languages.service';
import { CreateLanguageDto } from './dto/create-language.dto';
import { UpdateLanguageDto } from './dto/update-language.dto';
import { UpdateTranslationDto } from './dto/update-translation.dto';
import { CreateTranslationKeyDto } from './dto/create-translation-key.dto';
import { UpdateTranslationKeyDto } from './dto/update-translation-key.dto';
import { ApiTags, ApiOperation, ApiConsumes, ApiBody, ApiBearerAuth, ApiQuery } from '@nestjs/swagger';
import { FileInterceptor } from '@nestjs/platform-express';
import { AuthGuard } from 'src/auth/auth.guard';

@ApiTags('Languages')
@Controller('languages')
export class LanguagesController {
  constructor(private readonly languagesService: LanguagesService) { }

  @ApiOperation({ summary: 'Create a new language' })
  @ApiBearerAuth('access_token')
  @UseGuards(AuthGuard)
  @Post()
  create(@Body() createLanguageDto: CreateLanguageDto) {
    return this.languagesService.create(createLanguageDto);
  }

  @ApiOperation({ summary: 'Get all languages with pagination' })
  @ApiQuery({ name: 'page', required: false, example: 1 })
  @ApiQuery({ name: 'limit', required: false, example: 10 })
  @ApiQuery({ name: 'search', required: false })
  @ApiBearerAuth('access_token')
  @UseGuards(AuthGuard)
  @Get()
  findAll(
    @Query('page') page: string = '1',
    @Query('limit') limit: string = '10',
    @Query('search') search?: string
  ) {
    return this.languagesService.findAll(+page, +limit, search);
  }

  @ApiOperation({ summary: 'Get a language by ID' })
  @ApiBearerAuth('access_token')
  @UseGuards(AuthGuard)
  @Get(':id')
  findOne(@Param('id') id: string) {
    return this.languagesService.findOne(id);
  }

  @ApiOperation({ summary: 'Update a translation' })
  @ApiBearerAuth('access_token')
  @UseGuards(AuthGuard)
  @Patch('translations')
  updateTranslation(
    @Body() updateTranslationDto: UpdateTranslationDto,
  ) {
    console.log("updateTranslationDto" , updateTranslationDto)
    return this.languagesService.updateTranslation(updateTranslationDto);
  }

  @ApiOperation({ summary: 'Update a language' })
  @ApiBearerAuth('access_token')
  @UseGuards(AuthGuard)
  @Patch(':id')
  update(
    @Param('id') id: string,
    @Body() updateLanguageDto: UpdateLanguageDto,
  ) {
    return this.languagesService.update(id, updateLanguageDto);
  }

  @ApiOperation({ summary: 'Delete a language' })
  @ApiBearerAuth('access_token')
  @UseGuards(AuthGuard)
  @Delete(':id')
  remove(@Param('id') id: string) {
    return this.languagesService.remove(id);
  }

  @ApiOperation({ summary: 'Create a new translation key' })
  @ApiBearerAuth('access_token')
  @UseGuards(AuthGuard)
  @Post('keys')
  createTranslationKey(@Body() createTranslationKeyDto: CreateTranslationKeyDto) {
    return this.languagesService.createTranslationKey(createTranslationKeyDto);
  }

  @ApiOperation({ summary: 'Update a translation key' })
  @ApiBearerAuth('access_token')
  @UseGuards(AuthGuard)
  @Patch('keys/:id')
  updateTranslationKey(
    @Param('id') id: string,
    @Body() updateTranslationKeyDto: UpdateTranslationKeyDto
  ) {
    return this.languagesService.updateTranslationKey(id, updateTranslationKeyDto);
  }

  @ApiOperation({ summary: 'Delete a translation key' })
  @ApiBearerAuth('access_token')
  @UseGuards(AuthGuard)
  @Delete('keys/:id')
  deleteTranslationKey(@Param('id') id: string) {
    return this.languagesService.deleteTranslationKey(id);
  }

  @ApiOperation({ summary: 'Get translations for a language' })
  @ApiQuery({ name: 'page', required: false, example: 1 })
  @ApiQuery({ name: 'limit', required: false, example: 10 })
  @ApiQuery({ name: 'search', required: false })
  @ApiBearerAuth('access_token')
  @UseGuards(AuthGuard)
  @Get(':id/translations')
  getTranslations(
    @Param('id') id: string,
    @Query('page') page: string = '1',
    @Query('limit') limit: string = '10',
    @Query('search') search?: string
  ) {
    return this.languagesService.getTranslations(id, +page, +limit, search);
  }

 

  @ApiOperation({ summary: 'Export translations to CSV' })
  @ApiBearerAuth('access_token')
  @UseGuards(AuthGuard)
  @Get(':id/translations/export')
  exportTranslations(@Param('id') id: string) {
    return this.languagesService.exportTranslations(id);
  }

  @ApiOperation({ summary: 'Import translations from CSV' })
  @ApiConsumes('multipart/form-data')
  @ApiBody({
    schema: {
      type: 'object',
      properties: {
        file: {
          type: 'string',
          format: 'binary',
        },
      },
    },
  })
  @ApiBearerAuth('access_token')
  @UseGuards(AuthGuard)
  @Post(':id/translations/import')
  @UseInterceptors(FileInterceptor('file'))
  importTranslations(
    @Param('id') id: string,
    @UploadedFile() file: any,
  ) {
    return this.languagesService.importTranslations(id, file.buffer);
  }

  @ApiOperation({ summary: 'Seed default English language and keys' })
  @ApiBearerAuth('access_token')
  @UseGuards(AuthGuard)
  @Post('seed')
  seed() {
    return this.languagesService.seed();
  }

  @ApiOperation({ summary: 'Get public translations by language code' })
  @Get('public/:code')
  getPublicTranslations(@Param('code') code: string) {
    return this.languagesService.getPublicTranslations(code);
  }
}
