from datetime import date
from decimal import Decimal
from typing import Literal

from pydantic import BaseModel, Field

from app.sales.schemas import Pagination


CustomerStatus = Literal["AKTIF", "TIDAK"]


class CustomerListItem(BaseModel):
    kode_pelanggan: str
    nama_pelanggan: str | None
    alamat: str | None
    telepon: str | None
    nama_jalur: str | None
    jenis_outlet: str | None
    tingkat_harga: str | None
    jt: Decimal = Decimal("0")
    belum_jt: Decimal = Decimal("0")
    piutang: Decimal = Decimal("0")
    limit_piutang: Decimal = Decimal("0")
    limit_hari: int | None
    avg_omset: Decimal = Decimal("0")
    avg_pelunasan: Decimal = Decimal("0")
    nama_sales: str | None
    aktif: CustomerStatus


class CustomerListResponse(BaseModel):
    data: list[CustomerListItem]
    pagination: Pagination


class CustomerDetail(BaseModel):
    kode_pelanggan: str
    nama_pelanggan: str | None
    alamat: str | None = None
    telepon: str | None = None
    limit_piutang: Decimal = Decimal("0")
    limit_hari: int | None = None
    nama_wajib_pajak: str | None = None
    npwp: str | None = None
    jalan: str | None = None
    block: str | None = None
    nomor: str | None = None
    rt: str | None = None
    rw: str | None = None
    kecamatan: str | None = None
    kelurahan: str | None = None
    kabupaten: str | None = None
    propinsi: str | None = None
    kode_pos: str | None = None
    jalur_sales: str | None = None
    referensi: str | None = None
    kode_tingkat: str | None = None
    kode_outlet: str | None = None
    wa: str | None = None
    email: str | None = None
    nik: str | None = None
    sales_created: str | None = None
    kall: str | None = None
    program: bool = False
    keterangan: str | None = None
    aktif: CustomerStatus
    tanggal_created: date | None = None
    tanggal_edit: date | None = None


class CustomerWriteRequest(BaseModel):
    kode_pelanggan: str | None = Field(default=None, max_length=20)
    nama_pelanggan: str = Field(min_length=1, max_length=100)
    alamat: str | None = None
    telepon: str | None = None
    limit_piutang: Decimal = Field(default=Decimal("0"), ge=0)
    limit_hari: int | None = Field(default=None, ge=0)
    nama_wajib_pajak: str | None = None
    npwp: str | None = None
    jalan: str | None = None
    block: str | None = None
    nomor: str | None = None
    rt: str | None = None
    rw: str | None = None
    kecamatan: str | None = None
    kelurahan: str | None = None
    kabupaten: str | None = None
    propinsi: str | None = None
    kode_pos: str | None = None
    jalur_sales: str | None = None
    referensi: str | None = None
    kode_tingkat: str | None = None
    kode_outlet: str | None = None
    wa: str | None = None
    email: str | None = None
    nik: str | None = None
    sales_created: str | None = None
    kall: str | None = None
    program: bool = False
    keterangan: str | None = None
    aktif: CustomerStatus = "AKTIF"


class CustomerWriteResponse(BaseModel):
    kode_pelanggan: str
    message: str


class CustomerDeleteResponse(CustomerWriteResponse):
    pass


class CustomerCodePreview(BaseModel):
    kode_pelanggan: str


class MasterLookup(BaseModel):
    kode: str
    nama: str


class ReceivableSummary(BaseModel):
    kode_pelanggan: str
    jt: Decimal
    belum_jt: Decimal
    piutang: Decimal


class ReceivableNotificationItem(BaseModel):
    periode: str
    kode_pelanggan: str
    nama_pelanggan: str | None
    kode_sales: str | None
    nama_sales: str | None
    kodesi: str
    tanggal_faktur: date | None
    tanggal_jatuh_tempo: date | None
    total: Decimal
    returan: Decimal
    bayar: Decimal
    sisa: Decimal


class ReceivableNotificationResponse(BaseModel):
    data: list[ReceivableNotificationItem]
    pagination: Pagination


class SelectedReceivableRow(BaseModel):
    periode: str
    tanggal: date
    kodesi: str
    total: Decimal


class ReceivableTextRequest(BaseModel):
    kode_pelanggan: str
    nama_pelanggan: str
    selected_rows: list[SelectedReceivableRow] = Field(min_length=1)
    footer: str | None = None


class PeriodTotal(BaseModel):
    periode: str
    total: Decimal


class ReceivableTextResponse(BaseModel):
    message_text: str
    grand_total: Decimal
    periode_totals: list[PeriodTotal]
    whatsapp_phone: str | None = None


class WhatsAppInfo(BaseModel):
    kode_pelanggan: str
    phone: str | None


class WhatsAppLinkRequest(BaseModel):
    phone: str
    message_text: str


class WhatsAppLinkResponse(BaseModel):
    url: str