import {instance} from "./axios";
import {RecordsResponse} from "../models/Axios";
import { Employee } from "../models/HrSupport/Personnel";
import {HrRequest, HrRequestParams} from "../models/HrSupport/HrRequest";
import {
    GetFilesParams,
    PersonalFolderFile,
    Subfolder, UserDeltia,
    UserOverview
} from "../models/HrSupport/PersonalFolder";
import {CustomSelectOptions} from "../models/ReactComponents";
import {
    EmergencyPersonnelRequestsParams,
    PermanentEmployee,
    PermanentEmployeeDetailed
} from "../models/HrSupport/PermanentPersonnel";



/***
 *  OVERVIEW
 */

// USE FOR DUA PERSONAL FOLDR
export async function getMyEmployeeOverview(id: any) {
    return instance.get<UserOverview>(`api/hr_support/v1/my/folder`);
}

export async function getPersonnelSingle(activeRole:string,id: any) {

    return instance.get<UserOverview>(`api/hr_support/v1/personnel/${id}/${activeRole}`);
}



/***
 * REQUESTS
 */

export async function getRequests(params: HrRequestParams) {
    return instance.post("api/hr_support/v1/requestList", params);
}

// USE FOR DUA PERSONAL FOLDER
export async function getMyRequests(params: HrRequestParams) {
    return instance.post<RecordsResponse<HrRequest>>(`api/hr_support/v1/my/requests`, params);
}

export async function getRequestsForUserFolder(id: any, params: HrRequestParams) {
    return instance.post<RecordsResponse<HrRequest>>(`api/hr_support/v1/requests/${id}`, params);
}

// USE FOR DUA PERSONAL FOLDER
export async function getMyRequestSingle(request_id:string, source:string) {
    return instance.get(`api/hr_support/v1/my/request/${request_id}/${source}`);
}

export async function getRequestSingle(
    id: any,
    source: string | undefined,
    user_id: any,
    active_role: string
) {
    return instance.get(
        `api/hr_support/v1/requestDetails/${id}/${source}/${user_id}/${active_role}`);
}

export async function checkExistingRequest(source:string,id: any) {

    return instance.get(`api/hr_support/v1/requests/has-active/${source}/${id}`);
}

export async function getRequestTypes() {
    return instance.get("api/hr_support/v1/requestLookups/types");
}

export async function cancelRequest(id: number, request_source: string, employee_id: number) {
    return instance.post('api/hr_support/v1/request/cancel', {
        request_id: id,
        source: request_source,
        employee_id: employee_id
    });
}

/***
 * PERSONAL FOLDER FILES ENDPOINTS
 */

export async function getSubfolders(hashId: string,activeRole:string) {
    return instance.get<Subfolder[]>(`api/hr_support/v1/personnel/${hashId}/subfolders/${activeRole}`, {
    });
}

export async function getFileCategories(subfolder?: string | null |number) {
    return instance.get<CustomSelectOptions>("api/get/fileCategories", {
        params: {
            subfolder_id: subfolder
        }
    });
}

export async function getFileCategoriesFiltered(activeRole:string, subfolder?: string | null |number) {
    return instance.get<CustomSelectOptions>("api/hr_support/v1/personnel/categories", {
        params: {
            subfolder_id_emergency: subfolder,
            active_role: activeRole,
        }
    });
}


//FILE LIST FOR EMERGENCY
export async function getUserFiles(params: GetFilesParams) {
    return instance.post<RecordsResponse<PersonalFolderFile>>("api/hr_support/v1/personnel/subfolder/files", params);
}


export async function uploadFile(params: any) {
    return instance.post("api/hr_support/v1/store/file", params);
}

export async function replaceFile(params: any) {
    return instance.post("api/hr_support/v1/replace/file", params);
}

export async function downloadFile(filepath: string) {
    return instance.get("api/hr_support/v1/download/file", {
        params: {
            filepath: filepath,
        },
        responseType: 'blob',
    });
}

export async function deleteFile(uuid: string, filepath: string) {
    return instance.post("api/hr_support/v1/delete/files", {
        uuid: uuid,
        filepath: filepath
    });
}

export async function editFile(filepath: string, subject: string, protocol_number: string) {
    return instance.post("api/hr_support/v1/update/fields", {
        filepath: filepath,
        subject: subject,
        protocol_number: protocol_number
    });
}

//deletes file and any attachments it has if any
export async function moveFile(filepath: string, subfolder_id: number) {
    return instance.post("api/hr_support/v1/move/file", {
        filepath: filepath,
        subfolder_id: subfolder_id
    });
}

export async function uploadFileEmergency(params: any) {
    return instance.post("api/hr_support/v1/personnel/upload/file", params);
}

export async function downloadFileEmergency(filepath: string) {
    return instance.post(
        "api/hr_support/v1/personnel/download/file",
        { filepath: filepath },
        { responseType: 'blob' }  // ✅ third argument (config), not inside the body
    );
}
export async function deleteFileEmergency(activeRole:string, fileCategoryId:string, hashId:string, uuid: string, filepath: string) {
    return instance.post("api/hr_support/v1/personnel/delete/file", {
        uuid: uuid,
        filepath: filepath,
        active_role: activeRole,
        hash_id: hashId,
        file_category_id: fileCategoryId
    });
}



/***
 * DELTIA
 */


// USED FOR DUA PERSONAL FOLDER
export async function getMyDeltia() {
    return instance.get<UserDeltia>(`api/hr_support/v1/my/timesheets`);
}



export async function getUserDeltia(user_id: string) {
    return instance.get<UserDeltia>("api/hr_support/v1/personnel/timesheets/user", {
        params: {
            user_id: user_id
        }
    });
}

export async function initializeYear(dua_code: string, year: string, months: number[]) {
    return instance.post("api/hr_support/v1/personnel/create/year", {
        dua_code,
        year,
        months
    });
}

export async function editYear(dua_code: string, year: string, months: number[]) {
    return instance.post("api/hr_support/v1/personnel/edit/year", {
        dua_code,
        year,
        months
    });
}

export async function removeYear(dua_code: string, year: string) {
    return instance.post("api/hr_support/v1/personnel/delete/year", {
        year: year,
        dua_code: dua_code

    });
}

export async function lockDeltio(dua_code: string, year: string, month: number) {

    return instance.post("api/hr_support/v1/personnel/timesheets/locked", {

        dua_code: dua_code,
        year: year,
        month: month

    });
}


export async function uploadDeltio(formDataObject:any) {

    return instance.post("api/hr_support/v1/personnel/timesheet/upload", formDataObject);
}


/***
 * PERSONAL LIST PERMANENT
 */

export async function getPermanentPersonnel(params: EmergencyPersonnelRequestsParams) {
    return instance.get<RecordsResponse<PermanentEmployee>>("api/permanent/employee/management/list", {
        params: params
    });
}

export async function getPermanentPersonnelFilters() {
    return instance.get<Record<string, CustomSelectOptions>>("api/permanent/employee/management/filter");
}

export async function getSubfoldersPermanent(dua_code: string) {
    return instance.get<Subfolder[]>("api/get/subfolders/administration", {
        params: {
            dua_code: dua_code
        }
    });
}

export async function getPermanentEmployeeOverview(user: any) {
    return instance.get<PermanentEmployeeDetailed>("api/permanent/employee/management/view/user", {
        params: {
            user_id: user
        }
    });
}

export async function getLookupsForEmployeeOverview() {
    return instance.get<Record<string, CustomSelectOptions>>("api/permanent/employee/management/edit/lookup");
}


//THIS ROUTE IS FOR DUA ROLE-PERMANENT EMPLOYEE TO GET THEIR OWN FILES
export async function getMyPermanentUserFiles(params: GetFilesParams) {
    return instance.post<RecordsResponse<PersonalFolderFile>>("api/hr_support/v1/my/files", params);
}

//THIS ROUTE IS FOR HR-PERMANENT-MANEGER TO GET ANY PERMANENT EMPLOYEE FILES
export async function getPermanentUserFiles(params: GetFilesParams) {
    return instance.post<RecordsResponse<PersonalFolderFile>>("api/permanent/employee/management/files", params);
}

export async function createEmployee(params: PermanentEmployeeDetailed) {
    return instance.post("api/permanent/employee/management/store", params);
}

export async function editEmployee(hash_user_id: any, params: PermanentEmployeeDetailed) {
    return instance.post(`api/permanent/employee/management/${hash_user_id}/update`, params);
}

export async function sendInvitationPermanentPerson(hash_user_id: any) {
    return instance.post(`api/permanent/employee/management/${hash_user_id}/invite`);
}


/* --------------------------------- */
/*           Employees               */
/* --------------------------------- */

export function getEmployees(data: any) {
    return instance.post("api/hr_support/v1/list/Employeelist", data);
}

export function getSingleEmployee(id: any ) {
   return instance.get<Employee>(`api/rescom/v1/researcher/contracts/amendments/${id}`);
}

export async function getEmployeeDetails(id:any) {
    return instance.get(`api/hr_support/v1/list/EmployeeDetails/${id}`);
}

export function updateEmployeeDetails(data:any, id: any) {
    return instance.post(`api/hr_support/v1/list/EmployeeDetails/edit/${id}`, data);
}


/* --------------------------------- */
/*           Notes                   */
/* --------------------------------- */

export async function getSingleEmployeeNotes(refererId: any) {
    return instance.get(`api/hr_support/v1/list/HrNotes`, {
        params: {
            refererId: refererId
        }
    });
}

export async function AddSingleEmployeeNote(formData: any) {
	return instance.post(`/api/hr_support/v1/list/HrNotes/add`, formData);
}

export async function DeleteSingleEmployeeNote(id: any) {
	return instance.post(`/api/hr_support/v1/list/HrNotes/delete/${id}`);
}

export async function temporaryCardExtension(
    id: any,
    date_from: string | null,
    end_date: string | null,
    extend_date: string | null,
    project_code: string,
    comments_to_gate: string,
    init_a1: boolean
) {
    return instance.post('api/hr_support/v1/list/card/extend', {
        user_id: id,
        card_date_from: date_from,
        contract_end_date: end_date,
        extend_until_date: extend_date,
        project_code: project_code,
        comments_to_gate: comments_to_gate,
        init_a1: init_a1,
    });
}

/* --------------------------------- */
/*           Offboarding              */
/* --------------------------------- */

export async function deleteFileHr(formData: any) {
	return instance.post("api/hr_support/v1/list/delete/OffBoardingFiles", formData);
}

export async function getOffboardingDetails(boardingId: any) {
	return instance.get(`/api/hr_support/v1/list/Employee/${boardingId}/offboarding`);
}

export async function downloadFileHr(filepath: string) {
	return instance.get("api/hr_support/v1/download/file", {
		params: {
			filepath: filepath,
		},
		responseType: 'blob',
	});
}

export async function uploadFileHr(formData: any) {
	return instance.post("api/hr_support/v1/list/OffBoarding/store/file", formData);
}

export async function setOffboardingDates(params: any) {
    return instance.post<any>("api/hr_support/v1/list/Details/addScheduledAction", params);
}

export async function cancelOffboaring(id: number) {
    return instance.post('api/hr_support/v1/list/Details/cancelScheduledActions', {
          employeeId: id,
    });
}

export async function cancelOffboardingOrder(id: number) {
    return instance.post('api/hr_support/v1/list/cancelOffBoarding', {
        employeeId: id,
    });
}
