import { InternshipProposalAction, InternshipProposalActions } from "@/state/actions";
import { Internship } from "@/data";
import { Serializable } from "@/serialization/types";
import { internshipSerializationTransformer } from "@/serialization";
import {
    createSubmissionReducer,
    defaultDeanApprovalsState,
    defaultSubmissionState,
    MayRequireDeanApproval,
    SubmissionState
} from "@/state/reducer/submission";
import { Reducer } from "react";
import { SubmissionAction } from "@/state/actions/submission";
import { SubmissionState as ApiSubmissionState } from "@/api/dto/internship-registration";

export type InternshipProposalState = SubmissionState & MayRequireDeanApproval & {
    proposal: Serializable<Internship> | null;
    grade: number | null;
}

const defaultInternshipProposalState: InternshipProposalState = {
    ...defaultDeanApprovalsState,
    ...defaultSubmissionState,
    proposal: null,
    grade: null,
}

export const getInternshipProposal = ({ proposal }: InternshipProposalState): Internship | null =>
    proposal && internshipSerializationTransformer.reverseTransform(proposal);

const internshipProposalSubmissionReducer: Reducer<InternshipProposalState, InternshipProposalAction> = createSubmissionReducer({
    [InternshipProposalActions.Approve]: SubmissionAction.Approve,
    [InternshipProposalActions.Decline]: SubmissionAction.Decline,
    [InternshipProposalActions.Receive]: SubmissionAction.Receive,
    [InternshipProposalActions.Save]: SubmissionAction.Save,
    [InternshipProposalActions.Send]: SubmissionAction.Send,
})

const internshipProposalReducer = (state: InternshipProposalState = defaultInternshipProposalState, action: InternshipProposalAction): InternshipProposalState => {
    state = internshipProposalSubmissionReducer(state, action);

    switch (action.type) {
        case InternshipProposalActions.Save:
        case InternshipProposalActions.Send:
            return {
                ...state,
            }
        case InternshipProposalActions.Receive:
            if (state.overwritten) {
                return state;
            }

            return {
                ...state,
                accepted: action.state === ApiSubmissionState.Accepted,
                declined: action.state === ApiSubmissionState.Rejected,
                sent: [
                    ApiSubmissionState.Accepted,
                    ApiSubmissionState.Rejected,
                    ApiSubmissionState.Submitted
                ].includes(action.state),
                proposal: internshipSerializationTransformer.transform(action.internship),
                comment: action.comment || "",
                grade: action.grade || null,
            }
        default:
            return state;
    }
}

export default internshipProposalReducer;