import { BeforeInsert, Column, CreateDateColumn, Entity, JoinColumn, ManyToOne, PrimaryGeneratedColumn, UpdateDateColumn, OneToMany } from 'typeorm';
import { CampaignStatus } from '../enum/pes.enum';
import { PesVerifiedUsers } from './pes_verified_users.entity';
import { PesTemplate } from './pes-template.entity';
import { PesSendingProfile } from './pes-sending-profiles.entity';
import { PesLandingPage } from './pes-laning-pages.entity';
import { PesRecipientGroup } from './pes-recepient-group.entity';
import { PesEmailTracking } from './pes-email-tracking.entity';

@Entity('pes_campaigns')
export class PesCampaign {
  @PrimaryGeneratedColumn('uuid')
  id: string;

  @Column({ type: 'varchar', length: 100, unique: true, name: 'campaign_id' })
  campaignId: string;

  @Column({ type: 'varchar', length: 255 })
  name: string;

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

  @Column({
    type: 'enum',
    enum: CampaignStatus,
    default: CampaignStatus.DRAFT,
  })
  status: CampaignStatus;

  @Column({ type: 'timestamp', nullable: true, name: 'scheduled_date' })
  scheduledDate: Date;

  @Column({ type: 'timestamp', nullable: true, name: 'launch_date' })
  launchDate: Date;

  @Column({ type: 'timestamp', nullable: true, name: 'completed_date' })
  completedDate: Date;

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

  @Column({ type: 'boolean', default: false, name: 'send_immediately' })
  sendImmediately: boolean;

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

  // Relations
  @Column({ name: 'recipient_group_id', nullable: true })
  recipientGroupId: string;

  @ManyToOne(() => PesVerifiedUsers, user => user.campaigns)
  @JoinColumn({ name: 'verified_user_id' })
  verifiedUser: PesVerifiedUsers;

  @ManyToOne(() => PesTemplate, template => template.campaigns)
  @JoinColumn({ name: 'template_id' })
  template: PesTemplate;

  @ManyToOne(() => PesSendingProfile, profile => profile.campaigns)
  @JoinColumn({ name: 'sending_profile_id' })
  sendingProfile: PesSendingProfile;

  @ManyToOne(() => PesLandingPage, page => page.campaigns)
  @JoinColumn({ name: 'landing_page_id' })
  landingPage: PesLandingPage;

  @ManyToOne(() => PesRecipientGroup, group => group.campaigns, { nullable: true, onDelete: 'SET NULL' })
  @JoinColumn({ name: 'recipient_group_id' })
  recipientGroup: PesRecipientGroup;

  @OneToMany(() => PesEmailTracking, tracking => tracking.campaign)
  emailTrackings: PesEmailTracking[];

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

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

  @BeforeInsert()
  generateTrackingId() {
    if (!this.trackingId) {
      this.trackingId = `track_${Date.now()}_${Math.random().toString(36).substring(2, 15)}`;
    }
  }
}
