import {
  Entity, PrimaryGeneratedColumn, Column,
  CreateDateColumn, UpdateDateColumn,
  OneToOne, OneToMany, ManyToOne, JoinColumn
} from 'typeorm';
import { AssistanteMaternelle } from './assistantes_maternelles.entity';
import { Parents } from './parents.entity';
import { Message } from './messages.entity';
import { Relais } from './relais.entity';

// Enums alignés avec la BDD PostgreSQL
export enum RoleType {
  PARENT = 'parent',
  GESTIONNAIRE = 'gestionnaire',
  SUPER_ADMIN = 'super_admin',
  ASSISTANTE_MATERNELLE = 'assistante_maternelle',
  ADMINISTRATEUR = 'administrateur',
}

//Enum pour definir le genre
export enum GenreType {
  H = 'H',
  F = 'F',
  AUTRE = 'Autre',
}

//Enum pour definir le statut utilisateur
export enum StatutUtilisateurType {
  EN_ATTENTE = 'en_attente',
  ACTIF = 'actif',
  SUSPENDU = 'suspendu',
  REFUSE = 'refuse',
}

export enum SituationFamilialeType {
  CELIBATAIRE = 'celibataire',
  MARIE = 'marie',
  DIVORCE = 'divorce',
  VEUF = 'veuf',
  PACSE = 'pacse',
  SEPARE = 'separe',
  PARENT_ISOLE = 'parent_isole',
  CONCUBINAGE = 'concubinage',
}

//Declaration de l'entite utilisateur
@Entity('utilisateurs', { schema: 'public' })
export class Users {
  @PrimaryGeneratedColumn('uuid')
  id: string;

  @Column({ unique: true, name: 'email' })
  email: string;

  @Column({ name: 'password', nullable: true })
  password?: string;

  @Column({ name: 'prenom', nullable: true })
  prenom?: string;

  @Column({ name: 'nom', nullable: true })
  nom?: string;

  @Column({
    type: 'enum',
    enum: GenreType,
    enumName: 'genre_type', // correspond à l'enum de la db psql
    nullable: true,
    name: 'genre'
  })
  genre?: GenreType;

  @Column({
    type: 'enum',
    enum: RoleType,
    enumName: 'role_type', // correspond à l'enum de la db psql
    name: 'role'
  })
  role: RoleType;

  @Column({
    type: 'enum',
    enum: StatutUtilisateurType,
    enumName: 'statut_utilisateur_type', // correspond à l'enum de la db psql
    default: StatutUtilisateurType.ACTIF,
    name: 'statut'
  })
  statut: StatutUtilisateurType;

  @Column({ type: 'enum',
    enum: SituationFamilialeType,
    enumName: 'situation_familiale_type',
    nullable: true,
    name: 'situation_familiale'
  })
  situation_familiale?: SituationFamilialeType;

  @Column({ nullable: true, name: 'telephone' })
  telephone?: string;

  @Column({ nullable: true, name: 'adresse' })
  adresse?: string;

  @Column({ nullable: true, name: 'photo_url' })
  photo_url?: string;

  @Column({ default: false, name: 'consentement_photo' })
  consentement_photo: boolean;

  @Column({ type: 'timestamptz', nullable: true, name: 'date_consentement_photo' })
  date_consentement_photo?: Date;

  @Column({ default: false, name: 'changement_mdp_obligatoire' })
  changement_mdp_obligatoire: boolean;

  @Column({ nullable: true, name: 'token_creation_mdp', length: 255 })
  token_creation_mdp?: string;

  @Column({ type: 'timestamptz', nullable: true, name: 'token_creation_mdp_expire_le' })
  token_creation_mdp_expire_le?: Date;

  /** Ticket #127 — réinitialisation mot de passe oublié (distinct de token_creation_mdp / inscription) */
  @Column({ nullable: true, name: 'password_reset_token', length: 255 })
  password_reset_token?: string;

  @Column({ type: 'timestamptz', nullable: true, name: 'password_reset_expires' })
  password_reset_expires?: Date;

  /** Token pour reprise après refus (lien email), ticket #110 */
  @Column({ nullable: true, name: 'token_reprise', length: 255 })
  token_reprise?: string;

  @Column({ type: 'timestamptz', nullable: true, name: 'token_reprise_expire_le' })
  token_reprise_expire_le?: Date;

  @Column({ nullable: true, name: 'ville' })
  ville?: string;

  @Column({ nullable: true, name: 'code_postal' })
  code_postal?: string;

  @Column({ nullable: true, name: 'profession' })
  profession?: string;

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

  @Column({ name: 'lieu_naissance_ville', length: 100, nullable: true })
  lieu_naissance_ville?: string;

  @Column({ name: 'lieu_naissance_pays', length: 100, nullable: true })
  lieu_naissance_pays?: string;

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

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

  // Relations
  @OneToOne(() => AssistanteMaternelle, a => a.user)
  assistanteMaternelle?: AssistanteMaternelle;

  @OneToOne(() => Parents, p => p.user)
  parent?: Parents;

  @OneToMany(() => Message, m => m.sender)
  messages?: Message[];

  @OneToMany(() => Parents, parent => parent.co_parent)
  co_parent_in?: Parents[];

  @Column({ nullable: true, name: 'relais_id' })
  relaisId?: string;

  /** Numéro de dossier (format AAAA-NNNNNN), attribué à la soumission (ticket #103) */
  @Column({ nullable: true, name: 'numero_dossier', length: 20 })
  numero_dossier?: string;

  @ManyToOne(() => Relais, relais => relais.gestionnaires, { nullable: true })
  @JoinColumn({ name: 'relais_id' })
  relais?: Relais;
}
