import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { ErrorService } from '../../error/error.service';
import { Repository } from 'typeorm';
import { EmergencyPhoneEntity } from './entities/emergency-phone.entity';
import {
  applyFiltersToBuilder,
  applySortingToBuilder,
  paginationResult,
} from 'src/utils';
import { CreatePhoneDto } from './dto/create-phone.dto';
import { UpdatePhoneDto } from './dto/update-phone.dto';
import { getLastDisplayOrder } from 'src/utils/last-display-order';

@Injectable()
export class EmergencyPhoneService {
  constructor(
    @InjectRepository(EmergencyPhoneEntity)
    private EmergencyPhoneRepository: Repository<EmergencyPhoneEntity>,
    private error: ErrorService,
  ) {}

  /**
   * -------------------------------------------------------
   */
  async getAll(page = 1, limit = 20, filters = null, sorts = null) {
    let builder = this.EmergencyPhoneRepository.createQueryBuilder('phones');

    builder.take(limit);
    builder.skip((page - 1) * limit);

    if (sorts) {
      builder = applySortingToBuilder(builder, sorts);
    } else {
      builder.orderBy('phones.displayOrder', 'ASC');
    }

    builder = applyFiltersToBuilder(builder, filters);

    const [items, totalItems] = await builder.getManyAndCount();
    return {
      items,
      pagination: paginationResult(page, limit, totalItems),
    };
  }

  /**
   * -------------------------------------------------------
   */
  async getById(id: number) {
    return await this.EmergencyPhoneRepository.findOne(id);
  }

  /**
   * -------------------------------------------------------
   */
  async addPhone(dto: CreatePhoneDto) {
    const newPhone = new EmergencyPhoneEntity();
    for (const key in dto) {
      newPhone[key] = dto[key];
    }
    newPhone.displayOrder = await getLastDisplayOrder(
      EmergencyPhoneEntity.name,
    );
    newPhone.createdAt = new Date();
    newPhone.updatedAt = new Date();

    const { identifiers } =
      await this.EmergencyPhoneRepository.createQueryBuilder()
        .insert()
        .values(newPhone)
        .execute();

    const newPhoneId = identifiers[0].id;
    return await this.getById(newPhoneId);
  }

  /**
   * -------------------------------------------------------
   */
  async updatePhone(id: number, dto: UpdatePhoneDto) {
    return await this.EmergencyPhoneRepository.createQueryBuilder()
      .update()
      .set({ ...dto, updatedAt: new Date() })
      .where({ id })
      .execute();
  }

  /**
   * -------------------------------------------------------
   */
  async deletePhone(id: number) {
    return await this.EmergencyPhoneRepository.delete(id);
  }
}
