import { BaseModel } from 'src/common/entities/base.entity';
import { CowModel } from 'src/cow/entities/cow.entity';
import {
  Column,
  Entity,
  Index,
  JoinColumn,
  ManyToOne,
  PrimaryGeneratedColumn,
} from 'typeorm';

/**
 * 혈액화학검사 결과 (1개체 N검사)
 */
@Entity({ name: 'tb_mpt' })
export class MptModel extends BaseModel {
  @PrimaryGeneratedColumn({
    name: 'pk_mpt_no',
    type: 'int',
    comment: 'MPT 번호 (PK)',
  })
  pkMptNo: number;

  @Index('idx_mpt_cow_id')
  @Column({
    name: 'cow_id',
    type: 'varchar',
    length: 15,
    nullable: true,
    comment: '개체식별번호 (KOR...)',
  })
  cowId: string;

  @Column({
    name: 'cow_short_no',
    type: 'varchar',
    length: 4,
    nullable: true,
    comment: '개체 요약번호 (뒤 4자리)',
  })
  cowShortNo: string;

  @Index('idx_mpt_fk_farm_no')
  @Column({
    name: 'fk_farm_no',
    type: 'int',
    nullable: true,
    comment: '농장번호 FK',
  })
  fkFarmNo: number;

  @Column({
    name: 'test_dt',
    type: 'date',
    nullable: true,
    comment: '검사일자',
  })
  testDt: Date;

  @Column({
    name: 'month_age',
    type: 'int',
    nullable: true,
    comment: '월령',
  })
  monthAge: number;

  @Column({
    name: 'milk_yield',
    type: 'decimal',
    precision: 10,
    scale: 2,
    nullable: true,
    comment: '유량',
  })
  milkYield: number;

  @Column({
    name: 'parity',
    type: 'int',
    nullable: true,
    comment: '산차',
  })
  parity: number;

  @Column({
    name: 'glucose',
    type: 'decimal',
    precision: 10,
    scale: 2,
    nullable: true,
    comment: '혈당',
  })
  glucose: number;

  @Column({
    name: 'cholesterol',
    type: 'decimal',
    precision: 10,
    scale: 2,
    nullable: true,
    comment: '콜레스테롤',
  })
  cholesterol: number;

  @Column({
    name: 'nefa',
    type: 'decimal',
    precision: 10,
    scale: 2,
    nullable: true,
    comment: '유리지방산(NEFA)',
  })
  nefa: number;

  @Column({
    name: 'bcs',
    type: 'decimal',
    precision: 5,
    scale: 2,
    nullable: true,
    comment: 'BCS',
  })
  bcs: number;

  @Column({
    name: 'total_protein',
    type: 'decimal',
    precision: 10,
    scale: 2,
    nullable: true,
    comment: '총단백질',
  })
  totalProtein: number;

  @Column({
    name: 'albumin',
    type: 'decimal',
    precision: 10,
    scale: 2,
    nullable: true,
    comment: '알부민',
  })
  albumin: number;

  @Column({
    name: 'globulin',
    type: 'decimal',
    precision: 10,
    scale: 2,
    nullable: true,
    comment: '총글로불린',
  })
  globulin: number;

  @Column({
    name: 'ag_ratio',
    type: 'decimal',
    precision: 5,
    scale: 2,
    nullable: true,
    comment: 'A/G 비율',
  })
  agRatio: number;

  @Column({
    name: 'bun',
    type: 'decimal',
    precision: 10,
    scale: 2,
    nullable: true,
    comment: '요소태질소(BUN)',
  })
  bun: number;

  @Column({
    name: 'ast',
    type: 'decimal',
    precision: 10,
    scale: 2,
    nullable: true,
    comment: 'AST',
  })
  ast: number;

  @Column({
    name: 'ggt',
    type: 'decimal',
    precision: 10,
    scale: 2,
    nullable: true,
    comment: 'GGT',
  })
  ggt: number;

  @Column({
    name: 'fatty_liver_idx',
    type: 'decimal',
    precision: 10,
    scale: 2,
    nullable: true,
    comment: '지방간지수',
  })
  fattyLiverIdx: number;

  @Column({
    name: 'calcium',
    type: 'decimal',
    precision: 10,
    scale: 2,
    nullable: true,
    comment: '칼슘',
  })
  calcium: number;

  @Column({
    name: 'phosphorus',
    type: 'decimal',
    precision: 10,
    scale: 2,
    nullable: true,
    comment: '인',
  })
  phosphorus: number;

  @Column({
    name: 'ca_p_ratio',
    type: 'decimal',
    precision: 5,
    scale: 2,
    nullable: true,
    comment: '칼슘/인 비율',
  })
  caPRatio: number;

  @Column({
    name: 'magnesium',
    type: 'decimal',
    precision: 10,
    scale: 2,
    nullable: true,
    comment: '마그네슘',
  })
  magnesium: number;

  @Column({
    name: 'creatine',
    type: 'decimal',
    precision: 10,
    scale: 2,
    nullable: true,
    comment: '크레아틴',
  })
  creatine: number;

  // Relations
  @ManyToOne(() => CowModel, {
    onDelete: 'CASCADE',
    createForeignKeyConstraints: false
  })
  @JoinColumn({ name: 'cow_id', referencedColumnName: 'cowId' })
  cow: CowModel;
}
