import { Injectable, NotFoundException } from '@nestjs/common';
import { PrismaService } from '../prisma/prisma.service';
import * as slugify from 'slugify';

@Injectable()
export class ServicesService {
  constructor(private prisma: PrismaService) {}

  async findAll() {
    return this.prisma.service.findMany({
      orderBy: { name: 'asc' },
      include: { items: { orderBy: { orderNo: 'asc' } } },
    });
  }

  async findBySlug(slug: string) {
    const service = await this.prisma.service.findUnique({
      where: { slug },
      include: { items: { orderBy: { orderNo: 'asc' } } },
    });
    if (!service) throw new NotFoundException('Service not found');
    return service;
  }

  async adminFindAll() {
    return this.prisma.service.findMany({
      orderBy: { name: 'asc' },
      include: { items: { orderBy: { orderNo: 'asc' } } },
    });
  }

  async create(data: { name: string; icon?: string; description?: string }) {
    const slug = slugify.default(data.name, { lower: true, strict: true });
    return this.prisma.service.create({ data: { ...data, slug } });
  }

  async update(id: number, data: { name?: string; icon?: string; description?: string }) {
    const updateData: any = { ...data };
    if (data.name) {
      updateData.slug = slugify.default(data.name, { lower: true, strict: true });
    }
    return this.prisma.service.update({ where: { id }, data: updateData });
  }

  async remove(id: number) {
    return this.prisma.service.delete({ where: { id } });
  }

  async addItem(serviceId: number, data: { name: string; orderNo?: number }) {
    const service = await this.prisma.service.findUnique({ where: { id: serviceId } });
    if (!service) throw new NotFoundException('Service not found');
    return this.prisma.serviceItem.create({ data: { serviceId, name: data.name, orderNo: data.orderNo || 0 } });
  }

  async updateItem(itemId: number, data: { name?: string; orderNo?: number }) {
    const item = await this.prisma.serviceItem.findUnique({ where: { id: itemId } });
    if (!item) throw new NotFoundException('Service item not found');
    return this.prisma.serviceItem.update({ where: { id: itemId }, data });
  }

  async removeItem(itemId: number) {
    return this.prisma.serviceItem.delete({ where: { id: itemId } });
  }
}
