"""Pydantic schemas for finance models."""

from datetime import date, datetime
from typing import Optional
from uuid import UUID

from pydantic import BaseModel

from app.models.finance import (
    DeviceLoanStatus, LedgerEntryStatus, LedgerEntryType
)


# Student Ledger Schemas
class StudentLedgerBase(BaseModel):
    student_id: UUID
    academic_session_id: Optional[UUID] = None
    entry_type: LedgerEntryType
    description: str
    amount: float
    status: LedgerEntryStatus = LedgerEntryStatus.PENDING
    due_date: Optional[date] = None
    notes: Optional[str] = None


class StudentLedgerCreate(StudentLedgerBase):
    pass


class StudentLedgerResponse(StudentLedgerBase):
    id: UUID
    paid_date: Optional[datetime] = None
    payment_reference: Optional[str] = None
    payment_gateway: Optional[str] = None
    created_at: datetime
    updated_at: datetime

    class Config:
        from_attributes = True


# Device Loan Schemas
class DeviceLoanBase(BaseModel):
    student_id: UUID
    device_type: str
    device_model: Optional[str] = None
    device_serial: Optional[str] = None
    loan_amount: float
    monthly_payment: float
    total_months: int = 12
    status: DeviceLoanStatus = DeviceLoanStatus.PENDING
    disbursement_date: Optional[date] = None
    start_date: Optional[date] = None
    notes: Optional[str] = None


class DeviceLoanCreate(DeviceLoanBase):
    pass


class DeviceLoanResponse(DeviceLoanBase):
    id: UUID
    months_paid: int = 0
    completion_date: Optional[date] = None
    created_at: datetime
    updated_at: datetime

    class Config:
        from_attributes = True


# Device Loan Payment Schemas
class DeviceLoanPaymentBase(BaseModel):
    loan_id: UUID
    amount: float
    payment_date: datetime
    payment_reference: Optional[str] = None
    payment_gateway: Optional[str] = None
    month_number: int


class DeviceLoanPaymentCreate(DeviceLoanPaymentBase):
    pass


class DeviceLoanPaymentResponse(DeviceLoanPaymentBase):
    id: UUID
    created_at: datetime

    class Config:
        from_attributes = True


# Payment Initialization Schema
class PaymentInitializeRequest(BaseModel):
    student_id: UUID
    ledger_entry_id: Optional[UUID] = None
    device_loan_id: Optional[UUID] = None
    amount: float
    description: str
    callback_url: Optional[str] = None


class PaymentInitializeResponse(BaseModel):
    payment_reference: str
    payment_url: str
    gateway: str
    expires_at: datetime
