import DayBookTransaction from '#models/day_book_transaction'
import { dayBookTransactionListByAdminValidator } from '#validators/day_book'
import type { HttpContext } from '@adonisjs/core/http'
import { DayBookPaymentMethods, DayBookTransactionTypes } from '../../types/enum.js'

export default class DayBooksController {
  async dayBookTransactionListByAdmin({ request, response }: HttpContext) {
    const {
      page = 1,
      limit = 10,
      delivery_agent_id,
      transaction_type,
      payment_method,
      start_date,
      end_date,
    } = await request.validateUsing(dayBookTransactionListByAdminValidator)

    if (
      transaction_type &&
      transaction_type.length &&
      !transaction_type.every((type: number) =>
        Object.values(DayBookTransactionTypes)
          .filter((v) => typeof v === 'number')
          .includes(type)
      )
    ) {
      return response.badRequest({
        status: false,
        message: 'Invalid transaction type provided',
      })
    }

    if (
      payment_method &&
      payment_method.length &&
      !payment_method.every((method: number) =>
        Object.values(DayBookPaymentMethods)
          .filter((v) => typeof v === 'number')
          .includes(method)
      )
    ) {
      return response.badRequest({
        status: false,
        message: 'Invalid payment method provided',
      })
    }

    if (start_date && end_date && start_date > end_date) {
      return response.badRequest({
        status: false,
        message: 'Start date cannot be greater than end date',
      })
    }

    const dayBookTransactions = await DayBookTransaction.query()
      .if(delivery_agent_id && delivery_agent_id.length > 0, (query) => {
        query.whereIn('delivery_agent_id', delivery_agent_id as number[])
      })
      .if(transaction_type && transaction_type.length > 0, (query) => {
        query.whereIn('transaction_type', transaction_type as number[])
      })
      .if(payment_method && payment_method.length > 0, (query) => {
        query.whereIn('payment_method', payment_method as number[])
      })
      .if(start_date, (query) => {
        query.where('transaction_date', '>=', start_date!)
      })
      .if(end_date, (query) => {
        query.where('transaction_date', '<=', end_date!)
      })
      .preload('delivery_agent_details', (deliveryAgentQuery) => {
        deliveryAgentQuery.select('first_name', 'last_name')
      })
      // .join('users as user', 'user.id', 'day_book_transactions.delivery_agent_id')
      // .select(
      //   'day_book_transactions.*',
      //   db.raw("CONCAT(user.first_name, ' ', user.last_name) as delivery_agent_name")
      // )
      .orderBy('id', 'desc')
      .paginate(page, limit)

    return response.ok({
      message: 'Day book transactions fetched successfully',
      data: dayBookTransactions,
    })
  }
}
