import { eq } from "drizzle-orm";
import db from "../../db";
import { companies, branches, userBranches } from "../../db/schema";

export interface CreateCompanyParams {
  name: string;
  description?: string;
}

export interface UpdateCompanyParams {
  name?: string;
  description?: string;
}

/**
 * Сервис для работы с компаниями
 */
export const companyService = {
  /**
   * Создать компанию
   */
  async create(params: CreateCompanyParams) {
    const [company] = await db
      .insert(companies)
      .values({
        name: params.name,
        description: params.description,
      })
      .returning();

    return company;
  },

  /**
   * Получить все компании
   */
  async findAll() {
    const allCompanies = await db.query.companies.findMany({
      with: {
        branches: true,
      },
      orderBy: (companies, { asc }) => [asc(companies.name)],
    });

    return allCompanies;
  },

  /**
   * Найти компанию по ID
   */
  async findById(companyId: string) {
    const company = await db.query.companies.findFirst({
      where: eq(companies.id, companyId),
      with: {
        branches: true,
      },
    });

    return company || null;
  },

  /**
   * Обновить компанию
   */
  async update(companyId: string, params: UpdateCompanyParams) {
    const updateData: any = {
      updatedAt: new Date(),
    };

    if (params.name) {
      updateData.name = params.name;
    }

    if (params.description !== undefined) {
      updateData.description = params.description;
    }

    const [updatedCompany] = await db
      .update(companies)
      .set(updateData)
      .where(eq(companies.id, companyId))
      .returning();

    return updatedCompany;
  },

  /**
   * Удалить компанию (каскадно удалит все филиалы)
   */
  async delete(companyId: string) {
    await db.delete(companies).where(eq(companies.id, companyId));
  },
};
