import {instance} from "./axios";
import {
    AcceptInvitationParams,
    AddInvitationParams,
    CreateInvitationResponse,
    DeclineInvitationParams,
    DPassSelectOptions,
} from "../models/DPass/NewInvitation";
import {GetMyInvitationParams} from "../models/DPass/MyInvitations";
import {Invitation} from "../models/DPass/Invitation";
import {RecordsResponse} from "../models/Axios";
import {Visit} from "../models/DPass/Visit";
import {CardRequest} from "../models/DPass/CardRequest";
import {Order} from "../components/UI/DuaList/ListHeader/ListHead";
import {CustomSelectOptions} from "../models/ReactComponents";


export async function createInvitation(params: AddInvitationParams) {
    return instance.post<CreateInvitationResponse>("api/dpass/v1/invitation/add", params);
}

export async function sendInvitation(id: number) {
    return instance.post<CreateInvitationResponse>("api/dpass/v1/invitation/send-to-visitor", {invitation_id : id});
}

export async function cancelInvitation(id:any) {
    return instance.post("api/dpass/v1/invitation/cancel", {invitation_id : id});
}

export async function cancelVisit(id:any, actor:any) {
    return instance.post("api/dpass/v1/visit/cancel", {visit_id : id, actor:actor});
}

export async function completeVisit(id:number) {
    return instance.post("api/dpass/v1/visit/towards-completion", {visit_id : id});
}

export async function createAndSendInvitation(params: AddInvitationParams) {
    return instance.post<CreateInvitationResponse>("api/dpass/v1/invitation/add-and-send", params);
}

export async function createEmergencyInvitation(params: AddInvitationParams) {
    return instance.post<CreateInvitationResponse>("api/dpass/v1/invitation/emergency/add", params);
}

/**
 * Returns the options we need to fill the select dropdowwn on DPassForm
 */
export async function getDPassFormSelectOptions() {
    return instance.get<DPassSelectOptions>("api/dpass/v1/lookupsData");
}

export async function getDPassInvitationTypesSelectOptions() {
    return instance.get<any>("api/dpass/v1/invitations/types");
}


export async function getMyInvitations(params: GetMyInvitationParams) {
    return instance.post<RecordsResponse<Invitation>>("api/dpass/v1/invitations", params);
}

export async function getInvitation(id: string) {
    return instance.get<{'invitation': Invitation}>("api/dpass/v1/invitation/"+id);
}

export interface GetVisitParams {
    date_from?: string
    date_to?: string
    visit_statuses: string[]
    search?: string
    page: number
    page_size: number
}

export async function getAllVisits(params: GetVisitParams) {
    return instance.post<RecordsResponse<Visit>>("api/dpass/v1/visits", {
        ...params
    });
}

export async function getMyVisits(params: GetVisitParams) {
    return instance.post<RecordsResponse<Visit>>("api/dpass/v1/host/visits", {
        ...params
    });
}

export async function getMyVisit(id : string) {
    return instance.get<{'visit' : Visit}>(`api/dpass/v1/host/visit/${id}`);
}

export async function getVisitAsKeeper(id : string) {
    return instance.get<{'visit' : Visit}>(`api/dpass/v1/visit/${id}`);
}

export async function getSameMassVisit(id : string) {
    return instance.get<any>(`api/dpass/v1/visit-same-mass/${id}`);
}

export async function getSameMassInvitation(id : string) {
    return instance.get<any>(`api/dpass/v1/invitation-same-mass/${id}`);
}

export async function getInvitationStatuses() {
    return instance.get("api/dpass/v1/invitation/statuses");
}



export async function getVisitStatuses() {
    return instance.get("api/dpass/v1/visit/statuses");
}

export async function getCalendarVisits(params:any) {
    return instance.post<RecordsResponse<Visit>>("api/dpass/v1/visits/calendar", params);
}


export async function checkInVisit(id:number) {
    return instance.post<{'visit' : Visit}>("api/dpass/v1/visit/check-in-out", {
        visit_id: id,
        direction: 'in'
    });
}

export async function checkOutVisit(id:number) {
    return instance.post<{'visit' : Visit}>("api/dpass/v1/visit/check-in-out", {
        visit_id: id,
        direction: 'out'
    });
}

export async function updateVisit(params:any) {
    return instance.post("api/dpass/v1/invitation/update", params);
}

export async function updateNote(id:number, note:string) {
    return instance.post("api/dpass/v1/invitation/update", {
        invitation_id:id,
        gate_note: note
    });
}

export async function updateVehicle(id:number, vehicle_plate:string) {
    return instance.post("api/dpass/v1/invitation/update", {
        invitation_id:id,
        vehicle_plate: vehicle_plate
    });
}

export async function getGroupsLookup() {
    return instance.get<CustomSelectOptions>("api/dpass/v1/groups");
}

export async function checkoutGroup(id:number) {
    return instance.post("api/dpass/v1/checkout/group", {
        group_id:id,
    });
}


/**
 * DPASS card request routes
 */

export async function getRequests(params: GetRequestsParams) {
    return instance.post<RecordsResponse<CardRequest>>("api/dpass/v1/card-requests/requests", params);
}
export async function handleResolveDpassReq(id:number) {
    return instance.post("api/dpass/v1/card-requests/resolved", {card_request_id:id});
}

export async function getRequestStatuses() {
    return instance.get<CustomSelectOptions>("api/dpass/v1/card-requests/statuses");
}

export async function getRequestTypes() {
    return instance.get("api/dpass/v1/card-requests/types");
}



export async function getRequest(id: string) {
    return instance.get("api/dpass/v1/card-requests/request/"+id);
}


export async function updateStatusToReady(id:number,afm:string,type_name:string){
    return instance.post("api/dpass/v1/card-requests/ready", {
        card_request_id:id,
        afm:afm,
        type_name:type_name
    } );
}

export async function markAsError(id:number,afm:string){
    return instance.post("api/dpass/v1/card-requests/update", {
        card_request_id:id,
        status_id:4,
        afm:afm
    });
}

export async function resolveCardRequest(id:number,card_delivered_date:Date | undefined |null,card_returned_date:Date | undefined |null, mobile: string){
    return instance.post("api/dpass/v1/card-requests/resolved", {
        card_request_id:id,
        card_returned_date:card_returned_date,
        card_delivered_date:card_delivered_date,
        mobile: mobile
    } );
}

export interface GetRequestsParams {
    order: Order;
    order_by: string;
    status_id?: number
    type_id: string[]
    page: number
    page_size: number
    search?: string
}


/****
 * PUBLIC ROUTES FOR VISITORS
 *
 */

/**
 * Getting the pdf files needed for DPASS Invitations app views
 */

export async function getPdfs(locale:any) {
    return instance.get("public-api/pdfs",{
        params: {
            locale:locale
        }
    });
}



/**
 * visitors cancel their visits after accepting invitations
 */
export async function cancelAllVisits(sig: string | null) {
    return instance.post("public-api/dpass/v1/visits/cancel", {signature : sig});
}

/**
 * Returns the invitation's host data
 */

export async function getDPassInvitation(sig: string | null) {
    return instance.get<Invitation>("public-api/dpass/v1/link", {
        params: {signature: sig},
    });
}

/**
 * visitor accepts invitations after following link to his email
 */
export async function acceptInvitation( sig: string | null, body: AcceptInvitationParams) {
    return instance.post<CreateInvitationResponse>("public-api/dpass/v1/invitation/accept",{
            signature: sig,
            ...body
        }
    );
}

/**
 * visitor denies invitations after following link to his email
 */
export async function declineInvitation(sig: string | null, body: DeclineInvitationParams, ) {
    return instance.post("public-api/dpass/v1/invitation/decline" ,{
        signature: sig,
        ...body
    });
}
