import fs from 'node:fs';
import path from 'node:path';
import { S3Client, PutObjectCommand, GetObjectCommand } from '@aws-sdk/client-s3';
import { getSignedUrl } from '@aws-sdk/s3-request-presigner';

export const STORAGE_DIR = process.env.STORAGE_DIR || path.resolve(process.cwd(), '../data/storage');
const s3Enabled = () => !!process.env.S3_BUCKET;
let _s3: S3Client | null = null;
function s3() {
  if (!_s3) _s3 = new S3Client({
    region: process.env.S3_REGION || 'auto', endpoint: process.env.S3_ENDPOINT || undefined, forcePathStyle: process.env.S3_FORCE_PATH_STYLE === 'true',
    credentials: process.env.S3_ACCESS_KEY_ID ? { accessKeyId: process.env.S3_ACCESS_KEY_ID, secretAccessKey: process.env.S3_SECRET_ACCESS_KEY || '' } : undefined,
  });
  return _s3;
}
export async function putObject(key: string, body: Buffer, contentType: string) {
  if (s3Enabled()) { await s3().send(new PutObjectCommand({ Bucket: process.env.S3_BUCKET, Key: key, Body: body, ContentType: contentType })); return key; }
  const p = path.join(STORAGE_DIR, key); fs.mkdirSync(path.dirname(p), { recursive: true }); fs.writeFileSync(p, body); return key;
}
/** S3 ise süreli imzalı URL, yerel ise null (dosya akışla verilir). */
export async function signedUrl(key: string, filename?: string) {
  if (!s3Enabled()) return null;
  return getSignedUrl(s3(), new GetObjectCommand({ Bucket: process.env.S3_BUCKET, Key: key, ResponseContentDisposition: filename ? `attachment; filename="${filename}"` : undefined }), { expiresIn: 3600 });
}
export function localPath(key: string) {
  const p = path.resolve(STORAGE_DIR, key);
  if (!p.startsWith(path.resolve(STORAGE_DIR))) throw new Error('bad key');
  return p;
}
