import { Injectable, NotFoundException, ConflictException } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { Standard } from './entities/standard.entity';
import { CreateStandardDto } from './dto/create-standard.dto';
import { UpdateStandardDto } from './dto/update-standard.dto';

@Injectable()
export class StandardsService {
  constructor(
    @InjectRepository(Standard, 'certification_db')
    private readonly standardRepository: Repository<Standard>,
  ) {}

  async create(createStandardDto: CreateStandardDto) {
    const exists = await this.standardRepository.findOneBy({ name: createStandardDto.name });
    if (exists) throw new ConflictException('Standard with this name already exists');

    const standard = this.standardRepository.create(createStandardDto);
    return this.standardRepository.save(standard);
  }

  findAll() {
    return this.standardRepository.find({ order: { id: 'ASC' } });
  }

  async findOne(id: number) {
    const standard = await this.standardRepository.findOneBy({ id });
    if (!standard) throw new NotFoundException(`Standard with id ${id} not found`);
    return standard;
  }

  async update(id: number, updateStandardDto: UpdateStandardDto) {
    const standard = await this.standardRepository.findOneBy({ id });
    if (!standard) throw new NotFoundException(`Standard with id ${id} not found`);

    // check for duplicate name
    if (updateStandardDto.name) {
      const duplicate = await this.standardRepository.findOneBy({ name: updateStandardDto.name });
      if (duplicate && duplicate.id !== id) {
        throw new ConflictException('Another standard with this name already exists');
      }
    }

    await this.standardRepository.update(id, updateStandardDto);
    return this.standardRepository.findOneBy({ id });
  }

  async remove(id: number) {
    const result = await this.standardRepository.softDelete(id); // soft delete
    if (result.affected === 0) throw new NotFoundException(`Standard with id ${id} not found`);
    return { message: 'Standard deleted successfully', id };
  }
}
