import { eq } from "drizzle-orm";
import db from "../../db";
import { users } from "../../db/schema/users";
import type { User } from "../../db/schema/users";
import type { RoleName, UserResponse } from "./types";

/**
 * Сервис для работы с пользователями
 */
export const userService = {
  /**
   * Получить пользователя по email
   */
  async findByEmail(email: string): Promise<User | null> {
    const user = (
      await db.select().from(users).where(eq(users.email, email)).limit(1)
    )[0];

    return user || null;
  },

  /**
   * Получить пользователя по ID
   */
  async findById(userId: string): Promise<User | null> {
    const user = (
      await db.select().from(users).where(eq(users.id, userId)).limit(1)
    )[0];

    return user || null;
  },

  /**
   * Создать нового пользователя
   */
  async create(data: {
    email: string;
    password: string;
    fullName: string;
    role: RoleName;
  }): Promise<User> {
    const newUser = (
      await db
        .insert(users)
        .values({
          email: data.email,
          password: data.password,
          fullName: data.fullName,
          role: data.role,
        })
        .returning()
    )[0];

    return newUser;
  },

  /**
   * Проверить пароль пользователя
   */
  async verifyPassword(password: string, hash: string): Promise<boolean> {
    return await Bun.password.verify(password, hash);
  },

  /**
   * Захешировать пароль
   */
  async hashPassword(password: string): Promise<string> {
    return await Bun.password.hash(password, { algorithm: "bcrypt" });
  },

  /**
   * Убрать пароль из объекта пользователя
   */
  sanitize(user: User, includeRelations: boolean = false): UserResponse {
    return {
      id: user.id,
      email: user.email,
      fullName: user.fullName,
      role: user.role,
      createdAt: user.createdAt,
    };
  },

  /**
   * Получить пользователя по ID с полной информацией (филиал и компания)
   */
  async findByIdWithRelations(userId: string): Promise<User | null> {
    const user = await db.query.users.findFirst({
      where: eq(users.id, userId),
      with: {
        currentBranch: {
          with: {
            company: true,
          },
        },
      },
    });

    return user || null;
  },

  /**
   * Убрать пароль из объекта пользователя и добавить информацию о филиале и компании
   */
  sanitizeWithRelations(user: any): UserResponse {
    const response: UserResponse = {
      id: user.id,
      email: user.email,
      fullName: user.fullName,
      role: user.role,
      createdAt: user.createdAt,
    };

    if (user.currentBranch) {
      response.currentBranch = {
        id: user.currentBranch.id,
        name: user.currentBranch.name,
        address: user.currentBranch.address,
        city: user.currentBranch.city,
        country: user.currentBranch.country,
      };

      if (user.currentBranch.company) {
        response.currentCompany = {
          id: user.currentBranch.company.id,
          name: user.currentBranch.company.name,
          description: user.currentBranch.company.description,
        };
      }
    }

    return response;
  },
};
