import { Application } from 'express';
import { Resource } from 'express-automatic-routes';
import * as XLSX from 'xlsx';
import verify, { requireAdmin } from '#middlewares/auth';
import { Req, Res } from '#interfaces/IApi';

export default (_express: Application) => {
  return <Resource>{
    get: {
      middleware: [verify, requireAdmin],
      handler: async (req: Req, res: Res) => {
        try {
          // Use 'bed_codes' to allow multiple codes (comma/semicolon separated)
          const headers = [
            'bed_codes',
            'full_name',
            'email',
            'phone',
            'id_card',
            'date_of_birth',
            'nationality',
            'job',
            'emergency_contact_name',
            'emergency_contact_phone',
            'emergency_contact_relationship',
            'status',
            'move_in_at',
          ];

          const displayHeaders = [
            'Mã giường',
            'Họ và tên',
            'Email',
            'Số điện thoại',
            'Số CCCD/CMND',
            'Ngày sinh',
            'Quốc tịch',
            'Nghề nghiệp',
            'Người liên hệ khẩn cấp',
            'Số điện thoại liên hệ khẩn cấp',
            'Mối quan hệ với người liên hệ khẩn cấp',
            'Trạng thái',
            'Ngày vào ở',
          ];

          const exampleRow = [
            'BED-001, BED-002',
            'Nguyễn Văn A',
            'nguyenvana@example.com',
            '0901234567',
            '001234567890',
            '1990-05-15',
            'Việt Nam',
            'Kỹ sư phần mềm',
            'Nguyễn Thị B',
            '0902345678',
            'Vợ',
            'active',
            new Date().toISOString(),
          ];

          const wb = XLSX.utils.book_new();
          const ws = XLSX.utils.aoa_to_sheet([displayHeaders, exampleRow]);

          // Set column widths to 25 characters
          ws['!cols'] = headers.map(() => ({ wch: 25 }));

          // Force all cells in the used range to Text format (store as strings)
          if (ws['!ref']) {
            const range = XLSX.utils.decode_range(ws['!ref']);
            for (let R = range.s.r; R <= range.e.r; ++R) {
              for (let C = range.s.c; C <= range.e.c; ++C) {
                const addr = XLSX.utils.encode_cell({ c: C, r: R });
                const cell = ws[addr];
                if (cell) {
                  cell.v = cell.v === null || cell.v === undefined ? '' : String(cell.v);
                  cell.t = 's';
                  (cell as any).z = '@';
                } else {
                  ws[addr] = { t: 's', v: '' } as any;
                }
              }
            }
          }

          XLSX.utils.book_append_sheet(wb, ws, 'template');

          const buffer = XLSX.write(wb, { bookType: 'xlsx', type: 'buffer' });

          res.setHeader('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
          res.setHeader('Content-Disposition', `attachment; filename=resident_import_template.xlsx`);
          return res.send(buffer);
        } catch (err) {
          return res.error(err);
        }
      },
    },
  };
};
