from dataclasses import dataclass
from datetime import datetime
from typing import Optional


@dataclass
class MerchantListItem:
    """Slim domain entity for merchant list view (frontend-facing)."""

    id: int
    merchant_name: Optional[str] = None
    category_name: Optional[str] = None
    slug: Optional[str] = None              # used by frontend to construct partner/checkout URLs
    status: Optional[str] = None            # raw DB value (mutated to display value in use case)
    pre_status: Optional[int] = None
    receive_application: Optional[int] = None
    code: Optional[str] = None              # referral code
    contact_number: Optional[str] = None    # phone
    is_guest_active: Optional[int] = None
    has_module: bool = False
    is_agreement_signed: bool = False
    has_pan_card: bool = False
    has_equifax: bool = False
    has_gst_reg: bool = False
    has_active_offer: bool = False
    has_inactive_offer: bool = False
    has_bank: bool = False


@dataclass
class Merchant:
    """Domain entity representing a merchant."""

    id: int
    merchant_name: Optional[str] = None
    category_id: Optional[str] = None          # varchar in DB
    slug: Optional[str] = None
    merchant_logo: Optional[str] = None
    financial_partner: Optional[str] = None
    contact_number: Optional[str] = None
    email: Optional[str] = None
    address: Optional[str] = None
    grade_id: Optional[str] = None             # varchar in DB
    status: Optional[str] = None               # enum in DB
    max_no_cases: Optional[int] = None
    max_approval_value: Optional[int] = None
    hypothecation_charges: Optional[int] = None
    status_changed_by: Optional[int] = None
    deleted_at: Optional[datetime] = None
    created_at: Optional[datetime] = None
    created_by: Optional[int] = None
    updated_at: Optional[datetime] = None
    type_of_firm: Optional[str] = None
    nature_of_business: Optional[str] = None
    owner_name: Optional[str] = None
    title: Optional[str] = None
    gst_number: Optional[str] = None
    is_processing_fees: Optional[int] = None
    is_collected: Optional[int] = None
    code: Optional[str] = None
    referred_by: Optional[str] = None          # varchar in DB
    rcp: Optional[str] = None
    sales_head: Optional[str] = None
    finance_head: Optional[str] = None
    avg_ticket_size: Optional[int] = None
    rcp_email: Optional[str] = None
    rcp_mobile: Optional[str] = None
    sales_head_email: Optional[str] = None
    sales_head_mobile: Optional[str] = None
    finance_head_email: Optional[str] = None
    finance_head_mobile: Optional[str] = None
    is_guest_active: Optional[int] = None
    is_gst: Optional[int] = None
    state: Optional[str] = None
    anchor_merchant_id: Optional[int] = None
    pincode: Optional[str] = None
    source: Optional[str] = None
    gender: Optional[int] = None
    dob: Optional[datetime] = None
    pan_card: Optional[str] = None
    is_auto_abort: Optional[int] = None
    city: Optional[str] = None
    co_applicant_hyphen: Optional[int] = None
    co_applicant: Optional[int] = None
    gst_is_defaulter: Optional[int] = None
    gst_is_any_delay: Optional[int] = None
    months_gst_filled: Optional[int] = None
    gst_data: Optional[str] = None
    is_physical_verification: Optional[int] = None
    is_auto_abort_approved: Optional[int] = None
    rm_id: Optional[int] = None
    is_auto_doc: Optional[int] = None
    is_auto_approve: Optional[int] = None
    high_risk: Optional[int] = None
    vulnerable_merchant: Optional[int] = None
    vulnerable_merchant_date: Optional[datetime] = None
    pre_approval: Optional[int] = None
    send_collection_report: Optional[int] = None
    pending_adjustable_amount: Optional[str] = None   # varchar in DB
    pending_collection_report: Optional[int] = None
    special_notes: Optional[str] = None
    longitude: Optional[str] = None                   # varchar in DB
    latitude: Optional[str] = None                    # varchar in DB
    year_in_business: Optional[str] = None            # varchar in DB
    location_audit: Optional[str] = None              # varchar in DB
    liability_percent: Optional[str] = None           # varchar in DB
    insurance_premium: Optional[int] = None
    insurance_collection_method: Optional[int] = None
    location_serviceable: Optional[str] = None        # varchar in DB
    user_banking_reason: Optional[str] = None
    pre_status: Optional[int] = None
    charge_subvention_remaining_amount: Optional[int] = None
    welcome_letter_sent: Optional[int] = None
    send_da_on_checklist: Optional[int] = None
    target_number_application: Optional[str] = None   # varchar in DB
    target_value_application: Optional[str] = None    # varchar in DB
    custom_grade_id: Optional[int] = None
    remove_esign_otp: Optional[int] = None
    pay_data_sharing: Optional[int] = None
    official_merchant_name: Optional[str] = None
    collect_advance_amount: Optional[int] = None
    is_fldg_active: Optional[int] = None
    is_trade_advance: Optional[int] = None
    trade_advance_amount: Optional[str] = None        # varchar in DB
    trade_advance_balance: Optional[str] = None       # varchar in DB
    agreement_signed_with: Optional[str] = None
    agreement_signed_by: Optional[str] = None
    merchant_reg_type: Optional[str] = None
    designation_of_sign_auth: Optional[str] = None
    available_exposure: Optional[str] = None          # varchar in DB
    skip_appl_otp: Optional[int] = None
    auto_approve_category: Optional[int] = None
    combined_sl_la: Optional[int] = None
    ips: Optional[str] = None
    mis_frequency: Optional[int] = None
    create_app_lead_on_map: Optional[int] = None
    subv_inv_on_center: Optional[int] = None
    processing_fee_on_advance_amount: Optional[int] = None
    hold_liability: Optional[int] = None
    total_revenue_per_month: Optional[int] = None
    percentage_of_sales_in_emi: Optional[int] = None
    number_of_lenders: Optional[int] = None
    number_of_visits: Optional[int] = None
    landmark: Optional[str] = None
    table_of_offers: Optional[int] = None
    send_da: Optional[int] = None
    grade_name: Optional[str] = None
    is_hypothecation_active: Optional[int] = None
    remove_ip_whitelist: Optional[int] = None
    pf_surcharge_active: Optional[int] = None
    kw_capping: Optional[int] = None
    disb_post_installation: Optional[int] = None
    receive_application: Optional[int] = None


@dataclass
class MerchantLocation:
    id: Optional[int]
    merchant_id: int
    name: str
    slug: Optional[str] = None
    email: Optional[str] = None
    phone: Optional[str] = None
    address: Optional[str] = None  # Maps to 'location' in Laravel DB
    city: Optional[str] = None
    state: Optional[str] = None
    pincode: Optional[str] = None
    gst_number: Optional[str] = None
    landmark: Optional[str] = None
    total_revenue_per_month: Optional[int] = None
    percentage_of_sales_in_emi: Optional[int] = None
    number_of_lenders: Optional[int] = None
    number_of_visits: Optional[int] = None
    created_at: Optional[datetime] = None
    updated_at: Optional[datetime] = None
