import { Elysia, t } from "elysia";
import { authMiddleware } from "../middlewares/auth";
import { companyService } from "../services/company";

export const companyController = new Elysia({ prefix: "/companies" })
  // Все роуты требуют авторизации
  .use(authMiddleware)
  // GET /companies - получить все компании
  .get("/", async () => {
    const companies = await companyService.findAll();
    return { companies };
  })
  // GET /companies/:id - получить компанию по ID
  .get("/:id", async ({ params, status }) => {
    const { id } = params;

    const company = await companyService.findById(id);

    if (!company) {
      return status(404, "Company not found");
    }

    return { company };
  })
  // POST /companies - создать компанию
  .post(
    "/",
    async ({ body }) => {
      const { name, description } = body as {
        name: string;
        description?: string;
      };

      const company = await companyService.create({
        name,
        description,
      });

      return { company };
    },
    {
      body: t.Object({
        name: t.String({ minLength: 1, maxLength: 255 }),
        description: t.Optional(t.String({ maxLength: 1000 })),
      }),
    }
  )
  // PATCH /companies/:id - обновить компанию
  .patch(
    "/:id",
    async ({ params, body, status }) => {
      const { id } = params;
      const { name, description } = body as {
        name?: string;
        description?: string;
      };

      // Проверить существование компании
      const company = await companyService.findById(id);

      if (!company) {
        return status(404, "Company not found");
      }

      const updatedCompany = await companyService.update(id, {
        name,
        description,
      });

      return { company: updatedCompany };
    },
    {
      body: t.Object({
        name: t.Optional(t.String({ minLength: 1, maxLength: 255 })),
        description: t.Optional(t.String({ maxLength: 1000 })),
      }),
    }
  )
  // DELETE /companies/:id - удалить компанию
  .delete("/:id", async ({ params, status }) => {
    const { id } = params;

    // Проверить существование компании
    const company = await companyService.findById(id);

    if (!company) {
      return status(404, "Company not found");
    }

    await companyService.delete(id);

    return { message: "Company deleted successfully" };
  });
