import { api } from "@/lib/api/client";

export type LeaveDayType = "full" | "half_am" | "half_pm";
export type LeaveRequestStatus =
	| "pending"
	| "approved"
	| "rejected"
	| "cancelled";

export type LeaveType = {
	id: string;
	name: string;
	code: string;
	color: string;
	isPaid: boolean;
	isActive: boolean;
	defaultDaysPerYear: number;
};

export type LeaveBalance = {
	leaveTypeId: string;
	leaveTypeName: string;
	leaveTypeCode: string;
	leaveTypeColor: string;
	year: number;
	entitledDays: number;
	usedDays: number;
	carriedForwardDays: number;
	remainingDays: number;
};

export type LeaveRequest = {
	id: string;
	employeeId: string;
	employeeName: string;
	employeeCode: string;
	leaveTypeId: string;
	leaveTypeName: string;
	leaveTypeCode: string;
	leaveTypeColor: string;
	startDate: string;
	endDate: string;
	dayType: LeaveDayType;
	totalDays: number;
	reason: string;
	status: LeaveRequestStatus;
	approverId: string | null;
	approverEmail: string | null;
	decidedAt: string | null;
	decisionNote: string | null;
	createdAt: string;
};

export function getLeaveTypes(all = false) {
	return api.get<{ items: LeaveType[] }>(
		`/leave/types${all ? "?all=true" : ""}`,
	);
}

export function createLeaveType(data: {
	name: string;
	code: string;
	color?: string;
	isPaid?: boolean;
	defaultDaysPerYear?: number;
}) {
	return api.post<LeaveType>("/leave/types", data);
}

export function updateLeaveType(
	id: string,
	data: Partial<{
		name: string;
		color: string;
		isPaid: boolean;
		isActive: boolean;
		defaultDaysPerYear: number;
	}>,
) {
	return api.patch<LeaveType>(`/leave/types/${id}`, data);
}

export function deactivateLeaveType(id: string) {
	return api.delete<LeaveType>(`/leave/types/${id}`);
}

export function getLeaveBalances(employeeId?: string, year?: number) {
	const params = new URLSearchParams();
	if (employeeId) params.set("employeeId", employeeId);
	if (year) params.set("year", String(year));
	const query = params.toString();
	return api.get<{ employeeId: string; year: number; items: LeaveBalance[] }>(
		`/leave/balances${query ? `?${query}` : ""}`,
	);
}

export function getLeaveRequests(scope: "mine" | "pending" | "all" = "mine") {
	return api.get<{ items: LeaveRequest[] }>(`/leave/requests?scope=${scope}`);
}

export function getPendingLeaveCount() {
	return api.get<{ count: number }>("/leave/requests/pending-count");
}

export function createLeaveRequest(data: {
	leaveTypeId: string;
	startDate: string;
	endDate: string;
	dayType?: LeaveDayType;
	reason?: string;
}) {
	return api.post<LeaveRequest>("/leave/requests", data);
}

export function approveLeaveRequest(id: string) {
	return api.patch<LeaveRequest>(`/leave/requests/${id}/approve`, {});
}

export function rejectLeaveRequest(id: string, decisionNote?: string) {
	return api.patch<LeaveRequest>(`/leave/requests/${id}/reject`, {
		decisionNote,
	});
}

export function cancelLeaveRequest(id: string) {
	return api.patch<LeaveRequest>(`/leave/requests/${id}/cancel`, {});
}
