import type { Request, Response } from "express";
import { z } from "zod";
import { UpiService } from "../services/UpiService.js";

const upiSchema = z.object({
  upiId: z.string().trim().min(1, "UPI ID cannot be empty"),
});

export class UpiController {
  constructor(private readonly upiService = new UpiService()) { }

  create = async (req: Request, res: Response): Promise<void> => {
    try {
      const validatedData = upiSchema.parse(req.body);
      const result = await this.upiService.createUpi(
        validatedData.upiId,
        req.user?.id ? BigInt(req.user.id) : undefined
      );
      res.status(201).json({ message: "UPI created successfully", result });
    } catch (error) {
      if (error instanceof z.ZodError) {
        res.status(422).json({ message: "Validation failed", errors: error.issues });
        return;
      }
      const message = error instanceof Error ? error.message : "Failed to create UPI";
      res.status(400).json({ message });
    }
  };

  getAll = async (req: Request, res: Response): Promise<void> => {
    try {
      const result = await this.upiService.getUpis();
      res.status(200).json({ message: "UPIs fetched successfully", result });
    } catch (error) {
      const message = error instanceof Error ? error.message : "Failed to fetch UPIs";
      res.status(500).json({ message });
    }
  };

  getById = async (req: Request, res: Response): Promise<void> => {
    try {
      const id = parseInt(req.params.id as string);
      const result = await this.upiService.getUpiById(id);
      res.status(200).json(result);
    } catch (error) {
      const message = error instanceof Error ? error.message : "UPI not found";
      res.status(404).json({ message });
    }
  };

  update = async (req: Request, res: Response): Promise<void> => {
    try {
      const id = parseInt(req.params.id as string);
      const validatedData = upiSchema.parse(req.body);

      const result = await this.upiService.updateUpi(id, validatedData.upiId);
      res.status(200).json({ message: "UPI updated successfully", result });
    } catch (error) {
      if (error instanceof z.ZodError) {
        res.status(422).json({ message: "Validation failed", errors: error.issues });
        return;
      }
      const message = error instanceof Error ? error.message : "Failed to update UPI";
      res.status(400).json({ message });
    }
  };

  delete = async (req: Request, res: Response): Promise<void> => {
    try {
      const id = parseInt(req.params.id as string);
      await this.upiService.deleteUpi(id);
      res.status(200).json({ message: "UPI deleted successfully" });
    } catch (error: any) {
      const message = error instanceof Error ? error.message : "Failed to delete UPI";
      res.status(400).json({ message });
    }
  };
}
