/**
 * Employee Entity
 * Empleados de la empresa
 *
 * @module HR
 * @table hr.employees
 * @ddl schemas/02-hr-schema-ddl.sql
 */

import {
  Entity,
  PrimaryGeneratedColumn,
  Column,
  CreateDateColumn,
  UpdateDateColumn,
  ManyToOne,
  OneToMany,
  JoinColumn,
  Index,
} from 'typeorm';
import { Tenant } from '../../core/entities/tenant.entity';
import { User } from '../../core/entities/user.entity';
import { Puesto } from './puesto.entity';
import { EmployeeFraccionamiento } from './employee-fraccionamiento.entity';

export type EstadoEmpleado = 'activo' | 'inactivo' | 'baja';
export type Genero = 'M' | 'F';

@Entity({ schema: 'hr', name: 'employees' })
@Index(['tenantId', 'codigo'], { unique: true })
@Index(['tenantId', 'curp'], { unique: true })
export class Employee {
  @PrimaryGeneratedColumn('uuid')
  id: string;

  @Column({ name: 'tenant_id', type: 'uuid' })
  tenantId: string;

  @Column({ type: 'varchar', length: 20 })
  codigo: string;

  @Column({ type: 'varchar', length: 100 })
  nombre: string;

  @Column({ name: 'apellido_paterno', type: 'varchar', length: 100 })
  apellidoPaterno: string;

  @Column({ name: 'apellido_materno', type: 'varchar', length: 100, nullable: true })
  apellidoMaterno: string;

  @Column({ type: 'varchar', length: 18, nullable: true })
  curp: string;

  @Column({ type: 'varchar', length: 13, nullable: true })
  rfc: string;

  @Column({ type: 'varchar', length: 11, nullable: true })
  nss: string;

  @Column({ name: 'fecha_nacimiento', type: 'date', nullable: true })
  fechaNacimiento: Date;

  @Column({ type: 'varchar', length: 1, nullable: true })
  genero: Genero;

  @Column({ type: 'varchar', length: 255, nullable: true })
  email: string;

  @Column({ type: 'varchar', length: 20, nullable: true })
  telefono: string;

  @Column({ type: 'text', nullable: true })
  direccion: string;

  @Column({ name: 'fecha_ingreso', type: 'date' })
  fechaIngreso: Date;

  @Column({ name: 'fecha_baja', type: 'date', nullable: true })
  fechaBaja: Date;

  @Column({ name: 'puesto_id', type: 'uuid', nullable: true })
  puestoId: string;

  @Column({ type: 'varchar', length: 100, nullable: true })
  departamento: string;

  @Column({ name: 'tipo_contrato', type: 'varchar', length: 50, nullable: true })
  tipoContrato: string;

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

  @Column({ type: 'varchar', length: 20, default: 'activo' })
  estado: EstadoEmpleado;

  @Column({ name: 'foto_url', type: 'varchar', length: 500, nullable: true })
  fotoUrl: string;

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

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

  @Column({ name: 'created_by', type: 'uuid', nullable: true })
  createdById: string;

  // Relations
  @ManyToOne(() => Tenant)
  @JoinColumn({ name: 'tenant_id' })
  tenant: Tenant;

  @ManyToOne(() => Puesto, (p) => p.empleados)
  @JoinColumn({ name: 'puesto_id' })
  puesto: Puesto;

  @ManyToOne(() => User)
  @JoinColumn({ name: 'created_by' })
  createdBy: User;

  @OneToMany(() => EmployeeFraccionamiento, (ef) => ef.employee)
  asignaciones: EmployeeFraccionamiento[];

  // Computed property
  get nombreCompleto(): string {
    return [this.nombre, this.apellidoPaterno, this.apellidoMaterno]
      .filter(Boolean)
      .join(' ');
  }
}
