import {
  Body,
  Controller,
  Delete,
  Get,
  Param,
  ParseUUIDPipe,
  Patch,
  Post,
  Query,
  UploadedFile,
  UseInterceptors,
  BadRequestException,
} from '@nestjs/common';
import { FileInterceptor } from '@nestjs/platform-express';
import { diskStorage } from 'multer';
import { extname, join } from 'node:path';
import { mkdirSync } from 'node:fs';
import { MembersService } from './members.service';
import { CreateMemberDto, UpdateMemberDto } from './dto/member.dto';
import { RequirePermissions } from '../../common/decorators/permissions.decorator';
import { CurrentUser } from '../../common/decorators/current-user.decorator';

const UPLOADS_DIR = join(process.cwd(), 'uploads', 'members');
mkdirSync(UPLOADS_DIR, { recursive: true });

@Controller('members')
export class MembersController {
  constructor(private readonly members: MembersService) {}

  @Get()
  @RequirePermissions('members.view')
  list(
    @Query('q')          q?: string,
    @Query('status')     status?: string,
    @Query('memberType') memberType?: string,
    @Query('officeId')   officeId?: string,
    @Query('page')       page?: string,
    @Query('limit')      limit?: string,
  ) {
    return this.members.findAll({
      q, status, memberType, officeId,
      page:  page  ? Math.max(1, parseInt(page,  10) || 1)   : 1,
      limit: limit ? Math.min(200, parseInt(limit, 10) || 50) : 50,
    });
  }

  @Get(':id')
  @RequirePermissions('members.view')
  one(@Param('id', new ParseUUIDPipe()) id: string) {
    return this.members.getOne(id);
  }

  @Post()
  @RequirePermissions('members.create')
  create(@Body() dto: CreateMemberDto, @CurrentUser() user: { id: string }) {
    return this.members.create(dto, user?.id);
  }

  @Patch(':id')
  @RequirePermissions('members.update')
  update(
    @Param('id', new ParseUUIDPipe()) id: string,
    @Body() dto: UpdateMemberDto,
    @CurrentUser() user: { id: string },
  ) {
    return this.members.update(id, dto, user?.id);
  }

  @Delete(':id')
  @RequirePermissions('members.delete')
  remove(@Param('id', new ParseUUIDPipe()) id: string) {
    return this.members.remove(id);
  }

  // ── File upload ─────────────────────────────────────────
  @Post('upload')
  @RequirePermissions('members.create')
  @UseInterceptors(
    FileInterceptor('file', {
      storage: diskStorage({
        destination: UPLOADS_DIR,
        filename: (_req, file, cb) => {
          const unique = `${Date.now()}-${Math.round(Math.random() * 1e6)}`;
          cb(null, `${unique}${extname(file.originalname)}`);
        },
      }),
      fileFilter: (_req, file, cb) => {
        const allowed = ['.jpg', '.jpeg', '.png', '.gif', '.webp'];
        if (!allowed.includes(extname(file.originalname).toLowerCase())) {
          return cb(new BadRequestException('Only image files allowed'), false);
        }
        cb(null, true);
      },
      limits: { fileSize: 5 * 1024 * 1024 },
    }),
  )
  uploadPhoto(@UploadedFile() file: Express.Multer.File) {
    if (!file) throw new BadRequestException('No file uploaded');
    return { url: `/api/uploads/members/${file.filename}` };
  }
}
