import { ProjectAddService } from '../services/projectAddService.js'
import { sendError } from '../utils/response.js'
// import { OftenError } from '../utils/oftenError.js'
import { GeneralService } from '../share/generalservice.js';
import { trim_all_array } from '../utils/trim.js'
import { verifyToken, generateToken } from '../utils/token.js'
import { Interface } from '../interfaces/Interface.js';


export class projectAdd {

  constructor() {
    this.generalService = new GeneralService();
    this.Interface = new Interface();
    this.projectAddService = new ProjectAddService();
  }

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

  async onProjectAdd(req, res, database) {
    let idx = -1
    let aryResult = []
    let latSeq = []
    try {
      let token = req.headers.authorization?.split(' ')[1];
      const decoded = verifyToken(token);

      // ✅ รองรับทั้ง JSON { request: {...} } และ Form-Data (Flat body)
      const requestData = req.body.request ? req.body.request : req.body;
      
      let name = requestData.prjnam;
      
      // Override Database จาก Token ตาม Pattern เดิม
      database = decoded.organization || 'dbo';

      aryResult = await this.projectAddService.getProjectAdd(database, name);
      latSeq = await this.projectAddService.getLatestProjectSeq(database);
      //   this.generalService.devhint(1, 'budgetSearch.js', 'Login success');
    } catch (error) {
      idx = 1;
      console.error(error); // เพิ่ม log error เพื่อ debug
    } finally {
      if (idx === 1) return sendError('เกิดข้อผิดพลาดไม่คาดคิดเกิดขึ้น', 'Unexpected error');
      // if (!aryResult) return sendError('ไม่พบการมีอยู่ของข้อมูล', 'Cannot Find Any Data');

      if (aryResult == 0) {
        // ส่ง latSeq เข้าไป (ต้อง handle กรณี null ถ้า table ว่าง)
        const currentSeq = (latSeq && latSeq[0] && latSeq[0].prjseq) ? latSeq[0].prjseq : 0;
        let prommis = await this.makeArySave(req, currentSeq);
        return prommis
      } else {
        return sendError('คีย์หลักซ้ำในระบบ', 'Duplicate Primary Key');
      }
    }
  }


  async makeArySave(req, latseq) {
    // Extract Data ให้รองรับทั้ง 2 แบบ
    const requestData = req.body.request ? req.body.request : req.body;

    // ✅ แก้ไข: Sanitise Input ป้องกัน Error numeric: ""
    // ถ้าเป็นค่าว่าง ให้แปลงเป็น null หรือ 0.00 ตามประเภทข้อมูล
    const prjwntbdg = (requestData.prjwntbdg && requestData.prjwntbdg !== '') ? requestData.prjwntbdg : '0.00';
    const prjusrseq = (requestData.prjusrseq && requestData.prjusrseq !== '') ? requestData.prjusrseq : null;

    let arysave = {
      methods: 'post',
      prjseq: latseq + 1,
      prjnam: requestData.prjnam,
      prjusrseq: prjusrseq, 
      prjwntbdg: prjwntbdg,
      prjacpbdg: '0.00',
      prjbdgcod: '',
      prjcomstt: requestData.prjcomstt || 'UAC', // Default UAC ถ้ายิงมาแค่ชื่อกับงบ
      prjacpdtm: requestData.prjacpdtm || null
    }

    // เพิ่ม Logic จัดการไฟล์
    if (req.file) {
        arysave.prjdoc = req.file.filename // บันทึกชื่อไฟล์ลง DB
    }

    // กรณี User Seq ไม่ได้ส่งมา (เป็น null) ให้ใช้จาก Token
    if (!arysave.prjusrseq) {
        const token = req.headers.authorization?.split(' ')[1];
        const decoded = verifyToken(token);
        if (decoded) arysave.prjusrseq = decoded.id;
    }

    return this.Interface.saveInterface('prjmst', arysave, req);
  }
}