import { Injectable, OnModuleInit } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { Campaign } from '../campaigns/campaign.entity';
import { User, UserRole } from '../users/user.entity';
import * as bcrypt from 'bcrypt';

@Injectable()
export class SeedService implements OnModuleInit {
  constructor(
    @InjectRepository(Campaign)
    private campaignsRepository: Repository<Campaign>,
    @InjectRepository(User)
    private usersRepository: Repository<User>,
  ) {}

  async onModuleInit() {
    await this.seed();
  }

  async seed() {
    const count = await this.campaignsRepository.count();
    if (count > 0) return; // Already seeded

    const hashedPassword = await bcrypt.hash('password123', 10);

    // Create test brand user
    let brand = await this.usersRepository.findOne({ where: { email: 'brand@test.com' } });
    if (!brand) {
      brand = this.usersRepository.create({
        email: 'brand@test.com',
        password_hash: hashedPassword,
        role: UserRole.BRAND,
      });
      await this.usersRepository.save(brand);
    }

    // Create test creator user
    let creator = await this.usersRepository.findOne({ where: { email: 'creator@test.com' } });
    if (!creator) {
      creator = this.usersRepository.create({
        email: 'creator@test.com',
        password_hash: hashedPassword,
        role: UserRole.CREATOR,
      });
      await this.usersRepository.save(creator);
    }

    // Create test admin user
    let admin = await this.usersRepository.findOne({ where: { email: 'admin@test.com' } });
    if (!admin) {
      admin = this.usersRepository.create({
        email: 'admin@test.com',
        password_hash: hashedPassword,
        role: UserRole.ADMIN,
      });
      await this.usersRepository.save(admin);
    }

    const dummyCampaigns = [
      {
        title: 'Summer Fitness Challenge',
        description: 'Looking for energetic fitness creators to showcase our new summer line. Must involve outdoor workout routines.',
        budget: 5000,
        platform: 'TikTok',
        target_audience: 'Fitness enthusiasts, 18-35',
        status: 'active',
        brand,
      },
      {
        title: 'Tech Unboxing Series',
        description: 'Tech reviewers needed for unboxing our latest smart home devices. Authentic opinions valued.',
        budget: 3500,
        platform: 'YouTube',
        target_audience: 'Tech savvy, homeowners',
        status: 'active',
        brand,
      },
      {
        title: 'Streetwear Lifestyle Campaign',
        description: 'Fashion/Streetwear creators to seamlessly integrate our fall drop into your daily vlog or outfit checks.',
        budget: 12000,
        platform: 'Instagram',
        target_audience: 'Fashion forward, urban',
        status: 'active',
        brand,
      }
    ];

    for (const campaign of dummyCampaigns) {
      const newSetup = this.campaignsRepository.create(campaign);
      await this.campaignsRepository.save(newSetup);
    }
    
    console.log('Database seeded! Test accounts:');
    console.log('  Creator: creator@test.com / password123');
    console.log('  Brand:   brand@test.com   / password123');
    console.log('  Admin:   admin@test.com   / password123');
  }
}
