import { RegisterService } from '../services/registerservice.js'
import { sendError } from '../utils/response.js'
import { GeneralService } from '../share/generalservice.js';
import bcrypt from 'bcrypt'
import { Interface } from '../interfaces/Interface.js';
import { validateSave } from '../utils/validate.js'; // import เข้ามา

export class RegisterController {

  constructor() {
    this.generalService = new GeneralService();
    this.registerService = new RegisterService();
    this.Interface =  new Interface();
  }

  async onNavigate(req, res) {
    this.generalService.devhint(1, 'registercontroller.js', 'onNavigate() start');
    let organization = req.body.organization;
    const prommis = await this.onRegisterController(req, res, organization);
    return prommis;
  }

  async onRegisterController(req, res, database) {
    let idx = -1
    let result = []
    let aryUserDuplicate = [];
    try {
      // 1. ดึง Sequence ล่าสุดจาก Service (เพื่อเอามา +1)
      var Seq = await this.registerService.genNum(database);

      // 2. Hash Password
      let passwordRaw = req.body.request.password;
      const saltRounds = 10;
      var hashedPassword = await bcrypt.hash(passwordRaw, saltRounds);

      // 3. เรียก makeArySave เพื่อเตรียมข้อมูลและบันทึกผ่าน saveInterface
      // ส่ง nextSeq และ hashedPassword เข้าไป
      aryUserDuplicate = await this.registerService.checkUserDuplicate(database, req.body.request.email);
    
      
      this.generalService.devhint(1, 'registercontroller.js', 'Register success');

    } catch (error) {
      idx = 1;
    } finally { 
      if (idx === 1) return sendError('เกิดข้อผิดพลาดไม่คาดคิดเกิดขึ้น', 'Unexpected error');
      if (aryUserDuplicate.length > 0) return sendError('มีชื่อผู้ใช้หรืออีเมลนี้ในระบบแล้ว', 'Username or Email already exists');
      result = await this.makeArySave(req, Seq, hashedPassword);
      if (!result) return sendError('ไม่สามารถลงทะเบียนได้', 'Registration failed');
      return result 
    }
  }

  async makeArySave(req, seq, hashedPassword) {
    // Map ข้อมูลเข้า Field ตามตาราง usrmst
    let arysave = {
        methods: 'post',           // สั่งให้ saveInterface ทำการ INSERT
        usrseq: seq,           // PK: integer
        usrnam: validateSave(req.body.request.username, 'username'),        
        usrpwd: hashedPassword,    // character varying(255)
        usreml: req.body.request.email,    // character varying(50)
        usrthinam: validateSave(req.body.request.firstname, 'firstname'), // character varying(100)
        usrthilstnam: validateSave(req.body.request.lastname, 'lastname'), // character varying(100)
        
        // Field อื่นๆ ที่อาจต้อง Default ค่าไว้ก่อน (ตาม Schema)
        usrrol: 'U',   // Default User Role
        adpdte: '',    // Approved Date (รออนุมัติ)
        expdte: '',    // Expire Date
        lstlgn: '',    // Last Login
        usrorg: req.body.request.organization, // ถ้ามี field นี้
    }
    
    // เรียก saveInterface ผ่าน generalService (ระบุชื่อตาราง 'usrmst')
    return this.Interface.saveInterface('usrmst', arysave, req);
  }
}