import type { Branch } from './branch';
import type { Member } from './member';

/**
 * Financing Module Type Definitions
 *
 * Shared types for frontend components matching Laravel backend models
 */

export type FinancingStatus =
    | 'proposed'
    | 'approved'
    | 'disbursed'
    | 'active'
    | 'paid_off'
    | 'rejected'
    | 'written_off';

export type CollectibilityScore = 1 | 2 | 3 | 4 | 5;

export type InstallmentStatus = 'pending' | 'partial' | 'paid' | 'overdue';
export type PaymentMethod = 'cash' | 'transfer' | 'savings_debit';

/**
 * Financing Product (Master Data)
 */
export interface FinancingProduct {
    id: number;
    code: string;
    name: string;
    description: string | null;
    akad_type: 'murabahah' | 'salam' | 'istishna' | 'ijarah' | 'qardh';
    margin_rate: number; // Percentage (e.g., 10 for 10%)
    installment_count: number; // Number of days (e.g., 100)
    installment_frequency: 'daily' | 'weekly' | 'monthly';
    minimum_amount: number;
    maximum_amount: number;
    administration_fee: number;
    provision_fee: number;
    notary_fee: number;
    stamp_fee: number;
    insurance_fee: number;
    requires_collateral: boolean;
    requires_guarantor: boolean;
    is_active: boolean;
    created_at: string | null;
    updated_at: string | null;
    deleted_at: string | null;
}

/**
 * Financing (Main Entity)
 */
export interface Financing {
    id: number;
    account_number: string;
    legacy_account_number: string | null;
    member_id: number;
    branch_id: number;
    financing_product_id: number;
    collector_id: number | null;
    application_date: string;
    approval_date: string | null;
    rejected_date: string | null;
    disbursement_date: string | null;
    due_date: string | null;
    paid_off_date: string | null;
    principal_amount: number;
    margin_amount: number;
    total_repayment: number;
    installment_amount: number;
    installment_count: number;
    installment_frequency: 'daily' | 'weekly' | 'monthly';
    interest_rate: number;
    principal_balance: number;
    margin_balance: number;
    total_balance: number;
    status: FinancingStatus;
    collectibility_score: CollectibilityScore;
    status_notes: string | null;
    paid_installments?: number;

    // Fees
    administration_fee: number;
    stamp_fee: number;
    provision_fee: number;
    insurance_fee: number;
    notary_fee: number;

    // Collateral
    collateral_type: string | null;
    collateral_value: number | null;
    collateral_description: string | null;

    // Guarantor
    guarantor_name: string | null;
    guarantor_address: string | null;
    guarantor_phone: string | null;
    guarantor_occupation: string | null;

    // Other
    financing_purpose: string;
    economic_sector: string | null;
    notes: string | null;
    migration_principal_balance: number | null;
    migration_margin_balance: number | null;
    created_at: string | null;
    updated_at: string | null;
    deleted_at: string | null;
    created_by: number | null;
    updated_by: number | null;
    approved_by: number | null;
    rejected_by: number | null;

    // Relationships
    member: Pick<
        Member,
        'id' | 'id_number' | 'name' | 'phone' | 'email' | 'notes'
    >;
    branch?: Pick<Branch, 'id' | 'name'>;
    financing_product?: FinancingProduct;
    collector?: { id: number; name: string; email: string | null } | null;
    installments?: FinancingInstallment[];
    payments?: FinancingPayment[];
}

/**
 * Financing Installment (Payment Schedule)
 */
export interface FinancingInstallment {
    id: number;
    financing_id: number;
    sequence_number: number;
    due_date: string;
    principal_amount: number;
    margin_amount: number;
    total_amount: number;
    paid_principal: number;
    paid_margin: number;
    paid_total: number;
    status: InstallmentStatus;
    paid_date: string | null;
    days_overdue: number;
    late_penalty: number;
    created_at: string | null;
    updated_at: string | null;
    deleted_at: string | null;

    // Computed properties (Laravel accessors)
    is_overdue?: boolean;
    outstanding_principal?: number;
    outstanding_margin?: number;
    total_outstanding?: number;

    // Relationships
    financing?: Financing;
}

/**
 * Overdue Installment with Financing Details
 */
export interface OverdueInstallmentWithFinancing extends FinancingInstallment {
    outstanding_principal: number;
    outstanding_margin: number;
    total_outstanding: number;

    financing: Financing & {
        member: Pick<Member, 'id' | 'name' | 'phone'> & {
            member_number: string;
        };
        financing_product: Pick<
            FinancingProduct,
            'id' | 'name' | 'code'
        > | null;
    };
}

/**
 * Financing Payment (Transaction Record)
 */
export interface FinancingPayment {
    id: number;
    payment_number: string;
    financing_id: number;
    financing_installment_id: number | null;
    branch_id: number;
    collector_id: number | null;
    journal_entry_id: number | null;
    principal_amount: number;
    margin_amount: number;
    penalty_amount: number;
    total_amount: number;
    payment_date: string;
    payment_method: PaymentMethod;
    description: string | null;
    notes: string | null;
    is_posted: boolean;
    posted_at: string | null;
    created_at: string | null;
    updated_at: string | null;
    deleted_at: string | null;
    created_by: number | null;
    updated_by: number | null;

    // Relationships
    financing?: Pick<Financing, 'account_number'> & {
        member: Pick<Member, 'name'>;
    };
    branch?: Pick<Branch, 'id' | 'name'>;
    collector?: { id: number; name: string } | null;
    installment?: Pick<
        FinancingInstallment,
        'id' | 'sequence_number' | 'due_date'
    > | null;

    // Installments paid by this payment (if loaded)
    installmentPayments?: {
        installment_id: number;
        principal_amount: number;
        margin_amount: number;
        installment: Pick<FinancingInstallment, 'sequence_number' | 'due_date'>;
    }[];
}

/**
 * Filter types for list pages
 */
export interface FinancingFilters {
    search?: string;
    branch_id?: string;
    status?: string;
    product_id?: string;
    collector_id?: string;
}

export interface InstallmentFilters {
    status?: InstallmentStatus | 'all';
    date_from?: string;
    date_to?: string;
}

export interface PaymentFilters {
    date_from?: string;
    date_to?: string;
    payment_method?: PaymentMethod | 'all';
    min_amount?: number;
}

/**
 * Form data types
 */
interface BaseFormData {
    notes?: string;
}

export interface CreateFinancingFormData extends BaseFormData {
    member_id: string | number;
    financing_product_id: string;
    requested_amount: string;
    financing_purpose: string;
    collector_id?: string;
}

export interface ApproveFinancingFormData extends BaseFormData {
    approved_amount: string | number;
}

export interface RecordPaymentFormData extends BaseFormData {
    financing_id: string | number;
    amount: string;
    payment_method: PaymentMethod;
    payment_date: string;
    installment_ids?: number[]; // For manual allocation
}

export interface DisburseFinancingFormData extends BaseFormData {
    disbursement_method: 'cash' | 'transfer';
}

/**
 * Calculation result types (frontend computed)
 */
export interface FinancingCalculation {
    valid: boolean;
    principal: number;
    margin: number;
    total: number;
    daily: number; // Daily installment amount
    adminFee: number;
    provisiFee: number;
    notaryFee: number;
    surveyFee: number;
    totalFees: number;
    totalDisbursement: number;
    installmentCount: number;
    marginRate: number;
    error?: string;
}

export interface PaymentAllocation extends Pick<
    FinancingInstallment,
    | 'sequence_number'
    | 'due_date'
    | 'principal_amount'
    | 'margin_amount'
    | 'total_amount'
> {
    installment_id: number;
    remaining_balance: number;
}

/**
 * Stats types for dashboard cards
 */
export interface FinancingStats {
    total_applications: number;
    total_balance: number;
    active_financings: number;
    overdue_count: number;
    total_disbursed: number;
    total_collected: number;
}
