import { MigrationInterface, QueryRunner } from 'typeorm';

export class CreateLeadsTable1722250000000 implements MigrationInterface {
  name = 'CreateLeadsTable1722250000000';

  public async up(queryRunner: QueryRunner): Promise<void> {
    // ─── 1. leads table — matches your existing structure column-for-column ─
    await queryRunner.query(`
      CREATE TABLE \`leads\` (
        \`id\` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
        \`lead_code\` VARCHAR(255) NOT NULL,
        \`company\` VARCHAR(255) NOT NULL,
        \`contact\` VARCHAR(255) NULL,
        \`phone\` VARCHAR(255) NULL,
        \`email\` VARCHAR(255) NULL,
        \`website\` VARCHAR(255) NULL,
        \`standards\` LONGTEXT NULL,
        \`status\` ENUM('New','Interested','Converted','Lost') NOT NULL DEFAULT 'New',
        \`lost_reason\` VARCHAR(255) NULL,
        \`lost_notes\` TEXT NULL,
        \`lost_at\` TIMESTAMP NULL,
        \`source\` VARCHAR(255) NULL,
        \`priority\` ENUM('Low','Medium','High') NOT NULL DEFAULT 'Medium',
        \`notes\` TEXT NULL,
        \`tags\` LONGTEXT NULL,
        \`assigned_to\` INT NULL,
        \`created_by\` INT NULL,
        \`converted_at\` TIMESTAMP NULL,
        \`created_at\` TIMESTAMP NULL,
        \`updated_at\` TIMESTAMP NULL,
        \`deleted_at\` TIMESTAMP NULL,
        PRIMARY KEY (\`id\`),
        UNIQUE KEY \`UQ_leads_lead_code\` (\`lead_code\`),
        INDEX \`IDX_leads_status\` (\`status\`),
        INDEX \`IDX_leads_assigned_to\` (\`assigned_to\`),
        INDEX \`IDX_leads_created_by\` (\`created_by\`),
        INDEX \`IDX_leads_email\` (\`email\`),
        INDEX \`IDX_leads_company\` (\`company\`)
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
    `);

    await queryRunner.query(`
      ALTER TABLE \`leads\`
      ADD CONSTRAINT \`FK_leads_assigned_to\`
        FOREIGN KEY (\`assigned_to\`) REFERENCES \`users\`(\`id\`)
        ON DELETE SET NULL ON UPDATE CASCADE
    `);

    await queryRunner.query(`
      ALTER TABLE \`leads\`
      ADD CONSTRAINT \`FK_leads_created_by\`
        FOREIGN KEY (\`created_by\`) REFERENCES \`users\`(\`id\`)
        ON DELETE SET NULL ON UPDATE CASCADE
    `);

    // ─── 2. lead_activities — minimal timeline log (stand-in for Activity) ──
    await queryRunner.query(`
      CREATE TABLE \`lead_activities\` (
        \`id\` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
        \`lead_id\` BIGINT UNSIGNED NOT NULL,
        \`created_by\` INT NULL,
        \`actor_label\` VARCHAR(100) NOT NULL,
        \`message\` TEXT NOT NULL,
        \`happened_at\` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
        PRIMARY KEY (\`id\`),
        INDEX \`IDX_lead_activities_lead\` (\`lead_id\`)
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
    `);

    await queryRunner.query(`
      ALTER TABLE \`lead_activities\`
      ADD CONSTRAINT \`FK_lead_activities_lead\`
        FOREIGN KEY (\`lead_id\`) REFERENCES \`leads\`(\`id\`)
        ON DELETE CASCADE ON UPDATE CASCADE
    `);

    await queryRunner.query(`
      ALTER TABLE \`lead_activities\`
      ADD CONSTRAINT \`FK_lead_activities_created_by\`
        FOREIGN KEY (\`created_by\`) REFERENCES \`users\`(\`id\`)
        ON DELETE SET NULL ON UPDATE CASCADE
    `);
  }

  public async down(queryRunner: QueryRunner): Promise<void> {
    await queryRunner.query(`ALTER TABLE \`lead_activities\` DROP FOREIGN KEY \`FK_lead_activities_created_by\``);
    await queryRunner.query(`ALTER TABLE \`lead_activities\` DROP FOREIGN KEY \`FK_lead_activities_lead\``);
    await queryRunner.query(`DROP TABLE \`lead_activities\``);

    await queryRunner.query(`ALTER TABLE \`leads\` DROP FOREIGN KEY \`FK_leads_created_by\``);
    await queryRunner.query(`ALTER TABLE \`leads\` DROP FOREIGN KEY \`FK_leads_assigned_to\``);
    await queryRunner.query(`DROP TABLE \`leads\``);
  }
}
