import { DateTime } from 'luxon'
import { BaseModel, column, hasOne, belongsTo } from '@adonisjs/lucid/orm'
import { DayBookPaymentMethods, DayBookTransactionTypes } from '../../types/enum.js'
import type { HasOne, BelongsTo } from '@adonisjs/lucid/types/relations'
import User from './user.js'
import Order from './order.js'

export default class DayBookTransaction extends BaseModel {
  @column({ isPrimary: true })
  declare id: number

  @column()
  declare delivery_agent_id: number

  @column()
  declare order_id: number

  @belongsTo(() => Order, { localKey: 'id', foreignKey: 'order_id' })
  declare order_details: BelongsTo<typeof Order>

  @hasOne(() => User, { localKey: 'delivery_agent_id', foreignKey: 'id' })
  declare delivery_agent_details: HasOne<typeof User>

  @column({
    serialize: (value) => {
      return {
        id: value,
        name: DayBookTransactionTypes[value as keyof typeof DayBookTransactionTypes],
      }
    },
  })
  declare transaction_type: DayBookTransactionTypes

  @column({
    serialize: (value) => {
      return {
        id: value,
        name: DayBookPaymentMethods[value as keyof typeof DayBookPaymentMethods],
      }
    },
  })
  declare payment_method: DayBookPaymentMethods

  @column()
  declare amount: number

  @column()
  declare balance: number

  @column.dateTime()
  declare transaction_date: DateTime

  @column.dateTime({ autoCreate: true })
  declare created_at: DateTime

  @column.dateTime({ autoCreate: true, autoUpdate: true })
  declare updated_at: DateTime
}
