import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { ErrorService } from '../../error/error.service';
import { Repository } from 'typeorm';
import { CreateServiceTimeDto } from './dto/create-service-time.dto';
import { UpdateServiceTimeDto } from './dto/update-service-time.dto';
import { ServiceTimeEntity } from './entities/service-time.entity';
import {
  applyFiltersToBuilder,
  applySortingToBuilder,
  paginationResult,
} from 'src/utils';

@Injectable()
export class ServiceTimeService {
  constructor(
    @InjectRepository(ServiceTimeEntity)
    private serviceTimeRepository: Repository<ServiceTimeEntity>,

    private error: ErrorService,
  ) {}

  /**
   * -------------------------------------------------------
   * POST /serviceTimes/admin

   */
  async addTime(dto: CreateServiceTimeDto) {
    const newTime = new ServiceTimeEntity();
    for (const key in dto) {
      newTime[key] = dto[key];
    }

    newTime.createdAt = new Date();
    newTime.updatedAt = new Date();

    const { identifiers } = await this.serviceTimeRepository
      .createQueryBuilder()
      .insert()
      .values(newTime)
      .execute();

    const newTimeId = identifiers[0].id;
    return await this.serviceTimeRepository.findOne(newTimeId);
  }

  /**
   * -------------------------------------------------------
  * PUT /serviceTimes/1/admin

   */
  async updateTime(id: number, dto: UpdateServiceTimeDto) {
    return await this.serviceTimeRepository
      .createQueryBuilder()
      .update()
      .set({ ...dto, updatedAt: new Date() })
      .where({ id })
      .execute();
  }

  /**
   * -------------------------------------------------------
   * GET /serviceTimes/admin
   */
  async timeList(page = 1, limit = 20, filters = null, sorts = null) {
    let builder = this.serviceTimeRepository
      .createQueryBuilder('time')
      .take(limit)
      .skip((page - 1) * limit);

    if (sorts) {
      builder = applySortingToBuilder(builder, sorts);
    } else {
      builder.orderBy('time.createdAt', 'DESC');
    }

    builder = applyFiltersToBuilder(builder, filters);

    const [items, totalItems] = await builder.getManyAndCount();

    return {
      items,
      pagination: paginationResult(page, limit, totalItems),
    };
  }

  /**
   * -------------------------------------------------------
   * GET /serviceTimes/1/admin
   */
  async getTimeById(id: number) {
    return await this.serviceTimeRepository.findOne(id);
  }

  /**
   * -------------------------------------------------------
   */
  async findAll(where = {}) {
    return await this.serviceTimeRepository.find({ where });
  }

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