import { ClientsCompany } from "src/modules/clients-companies/entities/clients-company.entity"
import { Customer } from "src/modules/customers/entities/customer.entity"
import { City } from "src/modules/city/entities/city.entity"
import {
  Entity,
  PrimaryGeneratedColumn,
  Column,
  CreateDateColumn,
  UpdateDateColumn,
  DeleteDateColumn,
  ManyToOne,
  JoinColumn,
  OneToMany,
  AfterLoad,
} from "typeorm"
import { InvoiceTrips } from "./trip-invoice.entity"
import { Payment } from "src/modules/payment/entities/payment.entity"

@Entity("invoices")
export class Invoice {
  @PrimaryGeneratedColumn()
  id: number

  @Column({ type: "boolean", default: false })
  is_direct_customer: boolean

  @Column({ type: "int", nullable: true })
  client_id: number

  @Column({ type: "int", nullable: true })
  customer_id: number

  @Column({ type: "int", nullable: true })
  city_id: number

  @Column({ type: "varchar", nullable: false })
  invoice_type: string

  @Column({ type: "varchar", nullable: true })
  start_date: string

  @Column({ type: "varchar", nullable: true })
  end_date: string

  @Column({ type: "varchar", nullable: true })
  due_date: string

  @Column({ type: "int", default: 0 })
  discount: number

  @Column({ type: "varchar", nullable: true })
  notes: string

  @Column({ type: "varchar", default: 0 })
  base_price_total: number

  @Column({ type: "varchar", default: 0 })
  addons_price_total: number

  @Column({ type: "varchar", default: 0 })
  tax_amount: number

  @Column({ type: "int", default: 0 })
  invoice_tax: number

  @Column({ type: "varchar", default: 0 })
  discount_amount: number

  @Column({ type: "varchar", default: 0 })
  total_amount: number

  @Column({ type: "varchar", default: 0 })
  payment_received_amount: number

  due_amount?: number

  @Column({ type: "varchar" })
  status: string

  @CreateDateColumn({ type: "timestamp", default: () => "NOW()" })
  created_at: string

  @UpdateDateColumn({ type: "timestamp", default: () => "NOW()" })
  updated_at: string

  @DeleteDateColumn({ type: "timestamp", nullable: true })
  deleted_at: Date

  @ManyToOne(() => ClientsCompany, (client_company) => client_company.invoices)
  @JoinColumn({ name: "client_id" })
  client_company: ClientsCompany

  @ManyToOne(() => Customer, (customer) => customer.invoices)
  @JoinColumn({ name: "customer_id" })
  customer: Customer

  @ManyToOne(() => City)
  @JoinColumn({ name: "city_id" })
  city: City

  @OneToMany(() => InvoiceTrips, (invoice_trips) => invoice_trips.invoice)
  invoice_trips: InvoiceTrips[]

  @OneToMany(() => Payment, (payment) => payment.invoice)
  payments: Payment[]

  @AfterLoad()
  calculateDueAmount() {
    const total = parseFloat(this.total_amount?.toString() || "0")
    const received = parseFloat(this.payment_received_amount?.toString() || "0")
    this.due_amount = total - received
  }
}
