import {
  Entity,
  PrimaryGeneratedColumn,
  Column,
  ManyToOne,
  JoinColumn,
  CreateDateColumn,
  UpdateDateColumn,
  DeleteDateColumn,
  OneToMany,
  OneToOne,
} from "typeorm"
import { City } from "src/modules/city/entities/city.entity"
import { State } from "src/modules/state/entities/state.entity"
import { Country } from "src/modules/country/entities/country.entity"
import { ClientType } from "src/modules/client-type/entities/client-type.entity"
import { ClientCompanyContact } from "src/modules/client-company-contacts/entities/client-company-contact.entity"
import { Customer } from "src/modules/customers/entities/customer.entity"
import { ClientCompanyContract } from "src/modules/client-contract/entities/client-contract.entity"
import { InvoiceSettings } from "src/modules/clients-companies/entities/invoice-settings.entity"
import { Invoice } from "src/modules/invoices/entities/invoice.entity"
import { Payment } from "src/modules/payment/entities/payment.entity"

@Entity("clients_companies")
export class ClientsCompany {
  @PrimaryGeneratedColumn()
  id: number

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

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

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

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

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

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

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

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

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

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

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

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

  @Column({ type: "int" })
  client_type_id: number

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

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

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

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

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

  @ManyToOne(() => State, { onDelete: "RESTRICT" })
  @JoinColumn({ name: "state_id" })
  state: State

  @ManyToOne(() => Country, { onDelete: "RESTRICT" })
  @JoinColumn({ name: "country_id" })
  country: Country

  @ManyToOne(() => ClientType, { onDelete: "RESTRICT" })
  @JoinColumn({ name: "client_type_id" })
  client_type: ClientType

  @OneToMany(
    () => ClientCompanyContact,
    (client_contacts) => client_contacts.client_company,
  )
  client_contacts: ClientCompanyContact[]

  @OneToMany(() => Customer, (customer) => customer.client_company)
  customer: Customer[]

  @OneToMany(
    () => ClientCompanyContract,
    (contracts) => contracts.client_company,
  )
  contracts: ClientCompanyContract[]

  @OneToMany(() => Invoice, (invoices) => invoices.client_company)
  invoices: Invoice[]

  @OneToOne(() => InvoiceSettings, (invoiceSettings) => invoiceSettings.client)
  invoice_settings: InvoiceSettings

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