import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { ErrorService } from 'src/error/error.service';
import {
  applyFiltersToBuilder,
  applySortingToBuilder,
  paginationResult,
} from 'src/utils';
import { Repository } from 'typeorm';
import { LogAction, LogType } from '../log/log.interface';
import { LogService } from '../log/log.service';
import { CreateDayClosedDto } from './dto/create-day-closed.dto';
import { serviceDayClosedEntity } from './entities/service-day-closed.entity';

@Injectable()
export class ServiceDayClosedService {
  constructor(
    @InjectRepository(serviceDayClosedEntity)
    private serviceDayClosedRepository: Repository<serviceDayClosedEntity>,

    private error: ErrorService,
    private logService: LogService,
  ) {}

  /**
   * -------------------------------------------------------
   * GET /service_closed_days/admin
   */
  async getAll(page = 1, limit = 20, filters = null, sorts = null) {
    let builder = this.serviceDayClosedRepository.createQueryBuilder('days');

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

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

    builder = applyFiltersToBuilder(builder, filters);

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

  /**
   * -------------------------------------------------------
   * POST /service_closed_days/admin
   */
  async add(dto: CreateDayClosedDto, operatorUserId: string) {
    const { identifiers } = await this.serviceDayClosedRepository
      .createQueryBuilder()
      .insert()
      .values({
        ...dto,
        createdAt: new Date(),
        updatedAt: new Date(),
      })
      .execute();

    const itemId = identifiers[0].id;

    // Adding a log
    await this.logService.add({
      type: LogType.service_time,
      action: LogAction.insert,
      operatorUserId,
      message: `روز خارج از سرویس موردنظر، ثبت شد.`,
      affectedId: itemId,
      item: dto,
    });
  }

  /**
   * -------------------------------------------------------
   * DELETE /service_closed_days/1/admin
   */
  async delete(id: string, operatorUserId: string) {
    const day = await this.serviceDayClosedRepository.findOne(id);
    const item = { ...day };

    await day.remove();

    // Adding a log
    await this.logService.add({
      type: LogType.service_time,
      action: LogAction.delete,
      operatorUserId,
      message: `روز خارج از سرویس موردنظر، حذف شد.`,
      affectedId: String(item.id),
      item,
    });

    return true;
  }

  /**
   * -------------------------------------------------------
   */
  async getByDate(date: string) {
    return await this.serviceDayClosedRepository.findOne({ date });
  }
}
