import { logError } from "@/lib/logger";
import { error as errorResponse, success } from "@/lib/response";
import { TravelRulesService } from "@/v1/services/admin/travel-rules/travel-rules.service";
import { CreateTravelRuleSchema, UpdateTravelRuleSchema } from "@/v1/services/admin/travel-rules/travel-rules.schema";
import type { Context } from "hono";

export const listTravelRulesHandler = async (c: Context) => {
  try {
    const db = c.get("datastore");
    const service = TravelRulesService.getInstance();
    const query = c.req.query();
    const result = await service.listRules(db, {
      resort: query.resort,
      unit_code: query.unit_code,
      search: query.search,
      page: query.page ? Number(query.page) : undefined,
      limit: query.limit ? Number(query.limit) : undefined,
    });
    return success(c, result.data, result.message, 200);
  } catch (err: any) {
    logError("Error in listTravelRulesHandler:", err);
    return errorResponse(c, err?.message || "Failed to list travel rules", 500);
  }
};

export const getTravelRuleHandler = async (c: Context) => {
  try {
    const id: any = c.req.param("id");
    const db = c.get("datastore");
    const service = TravelRulesService.getInstance();
    const result = await service.getRule(db, id);
    if (!result.success) {
      return errorResponse(c, result.message, 404);
    }
    return success(c, result.data, result.message, 200);
  } catch (err: any) {
    logError("Error in getTravelRuleHandler:", err);
    return errorResponse(c, err?.message || "Failed to get travel rule", 500);
  }
};

export const createTravelRuleHandler = async (c: Context) => {
  try {
    const body = await c.req.json();
    const parsed = CreateTravelRuleSchema.safeParse(body);
    if (!parsed.success) {
      return errorResponse(c, `Invalid rule payload: ${parsed.error.issues.map((i) => `${i.path.join(".")} ${i.message}`).join("; ")}`, 400);
    }
    const { id, rule } = parsed.data;
    const db = c.get("datastore");
    const service = TravelRulesService.getInstance();
    const result = await service.createRule(db, id, rule ?? {});
    if (!result.success) {
      return errorResponse(c, result.message, 409);
    }
    return success(c, result.data, result.message, 201);
  } catch (err: any) {
    logError("Error in createTravelRuleHandler:", err);
    return errorResponse(c, err?.message || "Failed to create travel rule", 500);
  }
};

export const updateTravelRuleHandler = async (c: Context) => {
  try {
    const id: any = c.req.param("id");
    const body = await c.req.json();
    const parsed = UpdateTravelRuleSchema.safeParse(body);
    if (!parsed.success) {
      return errorResponse(c, `Invalid rule payload: ${parsed.error.issues.map((i) => `${i.path.join(".")} ${i.message}`).join("; ")}`, 400);
    }
    const db = c.get("datastore");
    const service = TravelRulesService.getInstance();
    const result = await service.updateRule(db, id, parsed.data);
    if (!result.success) {
      return errorResponse(c, result.message, 404);
    }
    return success(c, result.data, result.message, 200);
  } catch (err: any) {
    logError("Error in updateTravelRuleHandler:", err);
    return errorResponse(c, err?.message || "Failed to update travel rule", 500);
  }
};

export const deleteTravelRuleHandler = async (c: Context) => {
  try {
    const id: any = c.req.param("id");
    const db = c.get("datastore");
    const service = TravelRulesService.getInstance();
    const result = await service.deleteRule(db, id);
    if (!result.success) {
      return errorResponse(c, result.message, 404);
    }
    return success(c, result.data, result.message, 200);
  } catch (err: any) {
    logError("Error in deleteTravelRuleHandler:", err);
    return errorResponse(c, err?.message || "Failed to delete travel rule", 500);
  }
};
