import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { Supplier } from '../entities/supplier.entity';
import { PurchaseOrder } from '../entities/purchase-order.entity';
import { CreateSupplierDto } from '../dto/create-supplier.dto';
import { UpdateSupplierDto } from '../dto/update-supplier.dto';

@Injectable()
export class SupplierService {
  constructor(
    @InjectRepository(Supplier)
    private supplierRepository: Repository<Supplier>,
    @InjectRepository(PurchaseOrder)
    private purchaseOrderRepository: Repository<PurchaseOrder>,
  ) {}

  async findAll(): Promise<Supplier[]> {
    return this.supplierRepository.find({
      relations: ['purchaseOrders'],
      order: {
        createdAt: 'DESC',
      },
    });
  }

  async findOne(id: string): Promise<Supplier> {
    return this.supplierRepository.findOne({
      where: { id },
      relations: ['purchaseOrders'],
    });
  }

  async create(createDto: CreateSupplierDto): Promise<Supplier> {
    const supplier = this.supplierRepository.create(createDto);
    return this.supplierRepository.save(supplier);
  }

  async update(id: string, updateDto: UpdateSupplierDto): Promise<Supplier> {
    await this.supplierRepository.update(id, updateDto);
    return this.findOne(id);
  }

  async remove(id: string): Promise<void> {
    await this.supplierRepository.delete(id);
  }

  async getSupplierStats(): Promise<any> {
    const [totalSuppliers, activeSuppliers] = await Promise.all([
      this.supplierRepository.count(),
      this.supplierRepository.count({
        where: {
          isActive: true,
        },
      }),
    ]);

    const totalOrders = await this.purchaseOrderRepository.count();
    const totalSpent = await this.purchaseOrderRepository
      .createQueryBuilder('order')
      .select('SUM(order.totalAmount)', 'total')
      .getRawOne();

    return {
      totalSuppliers,
      activeSuppliers,
      totalOrders,
      totalSpent: totalSpent.total,
    };
  }

  async getTopSuppliers(limit: number = 10): Promise<any[]> {
    return this.supplierRepository
      .createQueryBuilder('supplier')
      .leftJoinAndSelect('supplier.purchaseOrders', 'order')
      .select(['supplier.id', 'supplier.name', 'supplier.email'])
      .addSelect('COUNT(order.id)', 'orderCount')
      .addSelect('SUM(order.totalAmount)', 'totalSpent')
      .groupBy('supplier.id')
      .orderBy('totalSpent', 'DESC')
      .limit(limit)
      .getRawMany();
  }
}
