import { Controller, Put, Get, Param, Req, Res, UseGuards, UnauthorizedException } from '@nestjs/common';
import type { Request, Response } from 'express';
import { SmbService } from './smb.service.js';
import { AuthGuard } from '@nestjs/passport';

@UseGuards(AuthGuard('jwt'))
@Controller('storage')
export class StorageController {
  constructor(private readonly smbService: SmbService) {}

  @Put('upload/:id')
  async uploadFile(@Param('id') id: string, @Req() req: any, @Res() res: Response) {
    try {
      const userId = req.user.userId;
      const destPath = Buffer.from(id, 'base64').toString('utf8');
      
      const writeStream = await this.smbService.createWriteStream(userId, destPath);
      
      req.pipe(writeStream);
      
      writeStream.on('finish', () => {
        res.status(200).send({ success: true });
      });
      
      writeStream.on('error', (err: any) => {
        console.error('SMB Write Error:', err);
        res.status(500).send({ error: 'Gagal menulis ke server SMB' });
      });
    } catch (e) {
      console.error(e);
      res.status(500).send({ error: 'Internal Server Error' });
    }
  }

  @Get('download/:id')
  async downloadFile(@Param('id') id: string, @Req() req: any, @Res() res: Response) {
    try {
      const userId = req.user.userId;
      const targetPath = Buffer.from(id, 'base64').toString('utf8');
      
      const stat = await this.smbService.stat(userId, targetPath);
      
      // Deteksi ekstensi file untuk memberikan MimeType yang sesuai agar browser bisa preview
      const ext = targetPath.split('.').pop()?.toLowerCase();
      let mimeType = 'application/octet-stream';
      if (ext === 'pdf') mimeType = 'application/pdf';
      else if (['jpg', 'jpeg'].includes(ext!)) mimeType = 'image/jpeg';
      else if (ext === 'png') mimeType = 'image/png';
      else if (ext === 'gif') mimeType = 'image/gif';
      else if (ext === 'txt') mimeType = 'text/plain';
      else if (ext === 'mp4') mimeType = 'video/mp4';

      res.writeHead(200, {
        'Content-Length': stat.size,
        'Content-Type': mimeType,
      });

      const readStream = await this.smbService.createReadStream(userId, targetPath);
      
      readStream.on('error', (err: any) => {
        console.error('SMB Stream Error:', err.code || err.message);
        if (!res.headersSent) {
          res.status(500).send({ error: 'Terjadi kesalahan saat membaca file' });
        } else {
          res.end();
        }
      });
      
      readStream.pipe(res);
    } catch (e: any) {
      console.error('SMB Read Error:', e);
      if (!res.headersSent) {
        res.status(404).send({ error: 'File tidak ditemukan atau akses ditolak oleh Windows' });
      }
    }
  }
}
