import { DateTime } from 'luxon'
import { BaseModel, column, hasOne } from '@adonisjs/lucid/orm'
import type { HasOne } from '@adonisjs/lucid/types/relations'
import Customer from './customer.js'
import { GroupInvoiceType } from '../../types/enum.js'
import GroupInvoice from './group_invoice.js'

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

  @column()
  declare generated_credit_note_id: string

  @column()
  declare customer_id: number

  @hasOne(() => Customer, { localKey: 'customer_id', foreignKey: 'id' })
  declare customer_details: HasOne<typeof Customer>

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

  @column()
  declare invoice_id: number

  @hasOne(() => GroupInvoice, { localKey: 'invoice_id', foreignKey: 'id' })
  declare invoice_details: HasOne<typeof GroupInvoice>

  @column.dateTime()
  declare credit_note_created_at: DateTime

  @column()
  declare amount: number

  @column()
  declare payable_amount: number

  @column({ serialize: (value) => value === 1 })
  declare is_adjusted: boolean

  @column()
  declare notes: string | null

  @column({ serialize: (value) => value === 1 })
  declare is_email_sent: boolean

  @column.dateTime()
  declare email_sent_at: DateTime

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

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