import { Injectable, UnauthorizedException, ConflictException } from '@nestjs/common';
import { UsersService } from '../users/users.service.js';
import { SmbService } from '../storage/smb.service.js';
import { JwtService } from '@nestjs/jwt';
import * as bcrypt from 'bcrypt';

@Injectable()
export class AuthService {
  constructor(
    private usersService: UsersService,
    private jwtService: JwtService,
    private smbService: SmbService
  ) {}

  async register(email: string, pass: string) {
    const existingUser = await this.usersService.findByEmail(email);
    if (existingUser) {
      throw new ConflictException('Email already exists');
    }

    const salt = await bcrypt.genSalt();
    const passwordHash = await bcrypt.hash(pass, salt);

    const user = await this.usersService.create({
      email,
      passwordHash,
    });

    return this.login(user);
  }

  async login(user: any) {
    const payload = { email: user.email, sub: user.id, role: user.role };
    return {
      access_token: this.jwtService.sign(payload),
      user: {
        id: user.id,
        email: user.email,
        role: user.role
      }
    };
  }

  async validateUser(email: string, pass: string): Promise<any> {
    // Langkah 1: Coba login ke Windows Server (SMB) secara langsung
    const isSmbValid = await this.smbService.testConnection(email, pass);
    if (!isSmbValid) {
      return null;
    }

    // Langkah 2: Jika SMB Valid, pastikan user ada di DB internal untuk UI Frontend
    let user = await this.usersService.findByEmail(email);
    if (!user) {
      // Auto-register jika belum ada di database
      user = await this.usersService.create({
        email,
        passwordHash: 'smb-managed', // Password sebenarnya tidak berguna lagi di DB
      });
    }

    // Langkah 3: Simpan password SMB di memori agar bisa dipakai saat request file (tanpa disimpan ke database)
    this.smbService.saveSession(user.id, email, pass);

    const { passwordHash, ...result } = user;
    return result;
  }
}
