import {
  Controller,
  Post,
  UseInterceptors,
  UploadedFile,
  Body,
  Get,
  Query,
  Patch,
  Param,
  Delete,
} from '@nestjs/common';
import { FileInterceptor } from '@nestjs/platform-express';
import { PageInfo } from 'src/common/decorator/query-page-info.decorator';
import { TokenData } from 'src/common/decorator/token-data.decorator';
import { PageInfoEntity } from 'src/common/entities/page-info.entity';
import { TokenDataEntity } from 'src/common/entities/token-data.entity';
import { Resource } from '../entities/resource.entity';
import { ResourceService } from '../service/resource.service';
import {
  ResourceDiscussionDto,
  ResourceDiscussionService,
} from '../service/resource-discussion.service';
import { NoAuthToken } from 'src/common/decorator/no-token.decorator';
import { ApiBearerAuth, ApiTags } from '@nestjs/swagger';
import { PaginationDTO } from 'src/assessment-evaluation/dto/pagination.dto';

/**
 *  用于资源管理的控制器类
 */
@ApiTags('资源管理')
@ApiBearerAuth()
@Controller('resource')
export class ResourceController {
  constructor(
    private readonly resourceService: ResourceService,
    private readonly resourceDiscussionService: ResourceDiscussionService,
  ) {}
  @Delete('discussion/:id')
  deleteDiscussion(
    @Param('id') id: number,
    @TokenData() tokenInfo: TokenDataEntity,
  ) {
    return this.resourceDiscussionService.delete(+id, tokenInfo);
  }
  @Get('pagingDis')
  @NoAuthToken()
  pagingDiscussion(
    @Query() paging: PaginationDTO,
    @TokenData() tokenInfo: any,
  ) {
    return this.resourceDiscussionService.paging(paging);
  }
  @Post('discussion')
  updateStudyDiscussion(
    @Body() discussionInfo: ResourceDiscussionDto,
    @TokenData() tokenInfo: any,
  ) {
    return this.resourceDiscussionService.updateStudy_discussion(
      discussionInfo,
      tokenInfo,
    );
  }
  /**
   * 上传文件接口
   *
   * @param file 上传的文件
   * @param body 请求体中的其他参数
   * @param token 用户token信息
   * @returns
   */
  @Post('upload')
  @UseInterceptors(FileInterceptor('file'))
  async uploadFile(
    @UploadedFile() file: Express.Multer.File,
    @Body() body,
    @TokenData() token: TokenDataEntity,
  ) {
    // 保存文件并返回Resource实例
    const resource = await this.resourceService.saveFile(file);
    // 如果请求体中有type参数，则将其赋值给resource实例的type属性
    if (body.type) resource.type = body.type;
    // 将请求体中的path参数赋值给resource实例的path属性
    resource.path = body.path;
    // 将请求体中的classifyId参数赋值给resource实例的classifyId属性
    resource.classifyId = body.classifyId;
    resource.share = body.share;
    // 将用户id赋值给resource实例的creator和updater属性
    resource.creator = resource.updater = token.userId;
    // 调用service层的create方法创建资源，并返回创建的资源实例
    return (await this.resourceService.create([resource])).pop();
  }

  /**
   * 创建资源接口
   *
   * @param data 请求体中的其他参数
   * @param token 用户token信息
   * @returns
   */
  @Post('createResource')
  async createResource(@Body() data, @TokenData() token: TokenDataEntity) {
    for (const item of data) {
      // 将用户id赋值给每个资源实例的creator和updater属性
      item.creator = item.updater = token.userId;
    }
    // 调用service层的create方法创建资源，并返回创建的资源实例
    return this.resourceService.create(data);
  }

  /**
   * 创建文件夹接口
   *
   * @param data 请求体中的其他参数
   * @param token 用户token信息
   * @returns
   */
  @Post('createFolder')
  async createFolder(@Body() data, @TokenData() token: TokenDataEntity) {
    return this.resourceService.createFolder({
      name: data.name, // 文件夹名称
      type: 'folder', // 文件夹类型
      path: data.path, // 文件夹路径
      updater: token.userId, // 更新者id
      creator: token.userId, // 创建者id
    } as Resource); // 将Resource实例作为参数传给service层的createFolder方法
  }

  /**
   * 获取资源列表接口
   *
   * @param pageInfo // 分页信息
   * @param token // 用户token信息
   * @param query // 查询参数
   * @returns
   */
  @Get()
  async findAll(
    @PageInfo() pageInfo: PageInfoEntity,
    @TokenData() token: TokenDataEntity,
    @Query() query,
  ) {
    // 将用户id赋值给查询参数的creator属性
    query.creator = token.userId;
    // 如果用户是管理员，则将isManager属性设置为true
    query.isManager = token.baseRole === 1;

    // 调用service层的findAll方法获取资源列表
    return this.resourceService.findAll(pageInfo, query);
  }

  /**
   * 获取单个资源信息接口
   *
   * @param id 资源ID
   * @returns
   */
  @Get('findOne/:id')
  async find(@Param('id') id: string) {
    // 调用service层的find方法获取资源信息
    return this.resourceService.find(+id);
  }

  /**
   * 用于查找所有文件夹的方法
   *
   * @param token 用户token信息
   * @returns
   */
  @Get('findAllFolder')
  async findAllFolder(@TokenData() token: TokenDataEntity) {
    // 调用资源服务的方法，传入用户id作为参数
    return this.resourceService.findAllFolder(token.userId);
  }

  /**
   * 用于修改资源名称的方法
   * @param id 资源id
   * @param name 新的资源名称
   * @param token 用户token信息
   * @returns
   */
  @Patch('rename/:id')
  async updateName(
    @Param('id') id: string,
    @Body('name') name: string,
    @TokenData() token: TokenDataEntity,
  ) {
    // 调用资源服务的方法，传入资源id和更新数据作为参数
    return this.resourceService.update(+id, {
      name,
      updater: token.userId,
    });
  }

  // 用于修改资源分类的方法
  @Patch('updateClassify')
  async updateClassify(@Body() data, @TokenData() token: TokenDataEntity) {
    // 设置更新者字段
    data.updater = token.userId;
    // 调用资源服务的方法，传入更新数据作为参数
    return this.resourceService.updateClassify(data);
  }

  /**
   * 用于修改资源路径的方法
   * @param data 请求体中的其他参数
   * @param token 用户token信息
   * @returns
   */
  @Patch('updatePath')
  async updatePath(@Body() data, @TokenData() token: TokenDataEntity) {
    // 设置更新者字段
    data.updater = token.userId;
    // 调用资源服务的方法，传入更新数据作为参数
    return this.resourceService.updatePath(data);
  }

  /**
   * 用于删除资源的方法
   *
   * @param ids
   * @returns
   */
  @Delete(':ids')
  async remove(@Param('ids') ids: string) {
    // 将ids字符串转换为数字数组
    return this.resourceService.remove(ids.split(',').map(Number));
  }

  /**
   * 用于文件转换的方法
   *
   * @param id 文件id
   * @param token 用户token信息
   * @returns
   */
  @Patch('fileConver/:id')
  async fileConver(
    @Param('id') id: string,
    @TokenData() token: TokenDataEntity,
  ) {
    // 调用资源服务的方法，传入文件id和用户id作为参数
    return this.resourceService.fileConver(+id, token.userId);
  }
}
