import { Pool } from 'pg'
import refreshTokenHelper from "../../utils/refreshTokenHelper"

const handleFunc = async (event: any) => {
  const config = useRuntimeConfig()
  const dbConfig = {
    host: config.pgHost,
    port: parseInt(config.pgPort || '5432'),
    database: config.pgDatabase,
    user: config.pgUser,
    password: config.pgPassword,
  }

  if (!dbConfig.host || !dbConfig.database || !dbConfig.user || !dbConfig.password) {
    throw createError({
      statusCode: 500,
      message: 'PostgreSQL credentials not configured. Please set PG_HOST, PG_DATABASE, PG_USER, PG_PASSWORD in .env'
    })
  }

  const pool = new Pool(dbConfig)
  const query = getQuery(event)
  const orgFilter = (query.org as string) || ''

  // Limited roles (FrontendMenu == 'c') only see their own organization. Admins
  // see all orgs (NULL filter is a no-op in the SQL below).
  const roleCookie = getCookie(event, 'logship_role')
  let menuType: string = 'Menu'
  try {
    const role = roleCookie ? JSON.parse(roleCookie) : null
    menuType = role?.FrontendMenu?.id || role?.FrontendMenu || 'Menu'
  } catch {}
  const orgIdCookie = getCookie(event, 'logship_organization_id')
  const orgIdNum = orgIdCookie ? parseInt(orgIdCookie) : NaN
  const orgIdFilter: number | null = (menuType === 'c' && Number.isFinite(orgIdNum)) ? orgIdNum : null

  try {
    const params: any[] = [orgIdFilter]
    let orgClause = ''
    if (orgFilter) {
      params.push(orgFilter)
      orgClause = `AND COALESCE(org.name, 'Unknown') = $${params.length}`
    }

    const sql = `
      SELECT
        io.m_inout_id        AS id,
        io.documentno        AS document_no,
        io.docstatus         AS doc_status,
        io.movementdate      AS movement_date,
        io.created           AS created,
        COALESCE(org.name, 'Unknown') AS org_name,
        bp.name              AS partner_name,
        wh.name              AS warehouse_name,
        ord.documentno       AS order_no,
        ord.c_order_id       AS order_id
      FROM m_inout io
      LEFT JOIN ad_org       org ON org.ad_org_id = io.ad_org_id
      LEFT JOIN c_bpartner   bp  ON bp.c_bpartner_id = io.c_bpartner_id
      LEFT JOIN m_warehouse  wh  ON wh.m_warehouse_id = io.m_warehouse_id
      LEFT JOIN c_order      ord ON ord.c_order_id = io.c_order_id
      WHERE io.ad_client_id   = 1000000
        AND io.isactive       = 'Y'
        AND io.issotrx        = 'Y'
        AND io.iscommissioned = 'N'
        AND io.docstatus      = 'CO'
        AND io.movementtype   = 'C-'
        AND io.c_doctype_id   = 1000011
        AND ord.isfulfillmentorder = 'Y'
        AND ($1::int IS NULL OR io.ad_org_id = $1)
        ${orgClause}
      ORDER BY io.movementdate DESC NULLS LAST, io.m_inout_id DESC
      LIMIT 300
    `

    const result = await pool.query(sql, params)

    const records = result.rows.map((r: any) => ({
      id: Number(r.id),
      documentNo: r.document_no || '',
      docStatus: r.doc_status || '',
      movementDate: r.movement_date,
      created: r.created,
      orgName: r.org_name || '',
      partnerName: r.partner_name || '',
      warehouseName: r.warehouse_name || '',
      orderNo: r.order_no || '',
      orderId: r.order_id ? Number(r.order_id) : null
    }))

    return { records, org: orgFilter || null }
  } catch (err: any) {
    console.error('PostgreSQL query error:', err)
    throw createError({
      statusCode: 500,
      message: `Database error: ${err.message}`
    })
  } finally {
    await pool.end()
  }
}

export default defineEventHandler(async (event) => {
  try {
    return await handleFunc(event)
  } catch(err: any) {
    try {
      let authToken: any = await refreshTokenHelper(event)
      return await handleFunc(event)
    } catch(error: any) {
      console.error('Fatal error in open-to-commission-list:', error)
      throw error
    }
  }
})
