import { Entity, PrimaryGeneratedColumn, Column, ManyToOne, JoinColumn, OneToMany, CreateDateColumn, UpdateDateColumn } from 'typeorm';
import { AreaEntity } from '@/server/modules/areas/area.entity';
import { DeleteStatus, DisabledStatus } from '@/share/types';

@Entity({ name: 'locations' })
export class LocationEntity {
  @PrimaryGeneratedColumn({ unsigned: true, comment: '地点ID' })
  id!: number;

  @Column({ name: 'name', type: 'varchar', length: 255, comment: '地点名称' })
  name!: string;

  @Column({ name: 'province_id', type: 'int', unsigned: true, comment: '省份ID' })
  provinceId!: number;

  @Column({ name: 'city_id', type: 'int', unsigned: true, comment: '城市ID' })
  cityId!: number;

  @Column({ name: 'district_id', type: 'int', unsigned: true, comment: '区县ID' })
  districtId!: number;

  @Column({ name: 'address', type: 'varchar', length: 500, comment: '详细地址' })
  address!: string;

  @Column({ name: 'latitude', type: 'decimal', precision: 10, scale: 6, nullable: true, comment: '纬度' })
  latitude!: number | null;

  @Column({ name: 'longitude', type: 'decimal', precision: 10, scale: 6, nullable: true, comment: '经度' })
  longitude!: number | null;

  // 关联关系 - 省份
  @ManyToOne(() => AreaEntity, { nullable: false })
  @JoinColumn({ name: 'province_id', referencedColumnName: 'id' })
  province!: AreaEntity;

  // 关联关系 - 城市
  @ManyToOne(() => AreaEntity, { nullable: false })
  @JoinColumn({ name: 'city_id', referencedColumnName: 'id' })
  city!: AreaEntity;

  // 关联关系 - 区县
  @ManyToOne(() => AreaEntity, { nullable: false })
  @JoinColumn({ name: 'district_id', referencedColumnName: 'id' })
  district!: AreaEntity;

  @Column({ name: 'is_disabled', type: 'int', default: DisabledStatus.ENABLED, comment: '是否禁用(0:启用,1:禁用)' })
  isDisabled!: DisabledStatus;

  @Column({ name: 'is_deleted', type: 'int', default: DeleteStatus.NOT_DELETED, comment: '是否删除(0:未删除,1:已删除)' })
  isDeleted!: DeleteStatus;

  @Column({ name: 'created_by', type: 'int', nullable: true, comment: '创建人ID' })
  createdBy!: number | null;

  @Column({ name: 'updated_by', type: 'int', nullable: true, comment: '更新人ID' })
  updatedBy!: number | null;

  @CreateDateColumn({ name: 'created_at', type: 'timestamp' })
  createdAt!: Date;

  @UpdateDateColumn({ name: 'updated_at', type: 'timestamp' })
  updatedAt!: Date;

  constructor(partial?: Partial<LocationEntity>) {
    Object.assign(this, partial);
  }
}