import { Request, Response } from "express";
import { sendSuccess } from "../../common/utils/api-response";
import * as organizationService from "./organization.service";
import { uploadToCloudinary } from "../../common/utils/upload-to-cloudinary";
import jwt from "jsonwebtoken";
import { env } from "../../config/env";
import { prisma } from "../../config/prisma";
import { setAuthCookies } from "../auth/auth.controller";

export async function createOrganization(req: Request, res: Response) {
  let logoUrl: string | undefined;
  if (req.file) {
    logoUrl = await uploadToCloudinary(req.file);
  }

  const result = await organizationService.createOrganization(req.user!.id, {
    ...req.body,
    ...(logoUrl && { logoUrl }),
  });

  // Re-issue tokens with updated organizationId so tenant context works immediately
  const user = await prisma.user.findUnique({
    where: { id: req.user!.id },
    select: { id: true, role: true, organizationId: true },
  });
  const accessToken = jwt.sign(
    { id: user!.id, role: user!.role, organizationId: user!.organizationId },
    env.JWT_ACCESS_SECRET,
    { expiresIn: env.JWT_ACCESS_EXPIRES_IN as any }
  );
  const refreshToken = jwt.sign(
    { id: user!.id, role: user!.role, organizationId: user!.organizationId },
    env.JWT_REFRESH_SECRET,
    { expiresIn: env.JWT_REFRESH_EXPIRES_IN as any }
  );

  setAuthCookies(res, accessToken, refreshToken);


  sendSuccess(res, { organization: result, accessToken, refreshToken }, 201);
}

export async function updateOrganization(req: Request, res: Response) {
  let logoUrl: string | undefined;

  if (req.file) {
    logoUrl = await uploadToCloudinary(req.file);
  }

  const result = await organizationService.updateOrganization(req.user!.id, {
    ...req.body,
    ...(logoUrl && { logoUrl }),
  });
  sendSuccess(res, result);
}

export async function getOrganization(req: Request, res: Response) {
  const result = await organizationService.getOrganization(req.user!.id);
  sendSuccess(res, result);
}

export async function getAllOrganizations(req: Request, res: Response) {
  const result = await organizationService.getAllOrganizations(req.user!.id);
  sendSuccess(res, result);
}

export async function deleteOrganization(req: Request, res: Response) {
  const { organizationId } = req.params;
  const result = await organizationService.deleteOrganization(
    req.user!.id,
    organizationId
  );
  sendSuccess(res, result);
}
