import { GeneralService } from '../share/generalservice.js';
import redis from '../utils/redis.js';
import { sendError } from '../utils/response.js';

export class VerifyEmailService {
  constructor() {
    // this.redis = new Redis();
    this.generalService = new GeneralService();
  }

  async verifyAndCreate({ email, token, schema = 'nuttakit' }) {
    // ✅ STEP 1: โหลด payload จาก Redis
    const key = `verify:${email}`;
    const stored = await redis.get(key);
    if (!stored) {
      throw sendError('ลิงก์หมดอายุหรือไม่ถูกต้อง', 'Verification link expired or invalid', 400);
    }

    let parsed;
    try {
      parsed = JSON.parse(stored);
    } catch (ex) {
      await redis.del(key).catch(() => {});
      throw sendError('ข้อมูลการยืนยันไม่ถูกต้อง', 'Invalid verify payload', 400);
    }

    // ✅ STEP 2: ตรวจสอบ token
    if (parsed.token !== token) {
      throw sendError('Token ไม่ถูกต้อง', 'Invalid token', 400);
    }

    // ✅ STEP 3: ตรวจสอบว่าอีเมลนี้เคยถูกสร้างใน schema แล้วหรือยัง
    const checkSql = `
      SELECT usrseq FROM \${database}.usrmst WHERE usrnam = $1
    `;
    const checkResult = await this.generalService.executeQueryParam(schema, checkSql, [email]);

    if (checkResult && checkResult.length > 0) {
      await redis.del(key).catch(() => {});
      throw sendError('อีเมลนี้ถูกใช้แล้วในองค์กรนี้', 'Email already registered in this organization', 400);
    }

    // ✅ STEP 4: Insert ข้อมูลลงในตารางจริง
    const insertSql = `
      INSERT INTO ${database}.usrmst (usrnam, usrthinam, usrthilstnam, usrpwd, usrrol)
      VALUES ($1, $2, $3, $4, 'U')
    `;
    const params = [email, parsed.fname, parsed.lname, parsed.hashedPwd];
    await this.generalService.executeQueryParam(schema, insertSql, params);

    // ✅ STEP 5: ลบ Redis Key (เคลียร์ payload)
    await redis.del(key).catch(() => {});

    this.generalService.devhint(2, 'verifyemailservice.js', `✅ Account verified (${email})`);

    // ✅ STEP 6: ส่งผลลัพธ์กลับ
    return {
      code: '200',
      message_th: 'ยืนยันอีเมลสำเร็จ บัญชีถูกสร้างแล้ว',
      data: {
        email,
        schema,
      },
    };
  }
}
