from enum import Enum


class AccountType(str, Enum):
    ASSET = "asset"
    LIABILITY = "liability"
    EQUITY = "equity"
    REVENUE = "revenue"
    EXPENSE = "expense"


class AccountNature(str, Enum):
    DEBIT = "debit"
    CREDIT = "credit"


class VoucherType(str, Enum):
    JOURNAL = "journal"
    PAYMENT = "payment"
    RECEIPT = "receipt"
    CONTRA = "contra"
    SALES = "sales"
    PURCHASE = "purchase"


class VoucherStatus(str, Enum):
    DRAFT = "draft"
    POSTED = "posted"
    CANCELLED = "cancelled"


class ReportType(str, Enum):
    LEDGER = "ledger"
    TRIAL_BALANCE = "trial_balance"
    INCOME_STATEMENT = "income_statement"
    BALANCE_SHEET = "balance_sheet"


class StockReportStatus(str, Enum):
    IN_STOCK = "in_stock"
    LOW_STOCK = "low_stock"
    OUT_OF_STOCK = "out_of_stock"
    INACTIVE = "inactive"


class StockReportBasis(str, Enum):
    CURRENT_STOCK = "current_stock"


class TxnReportType(str, Enum):
    SALES_INVOICE = "sales_invoice"
    PURCHASE_BILL = "purchase_bill"
    PAYMENT_RECEIVED = "payment_received"
    PAYMENT_MADE = "payment_made"
    SALES_RETURN = "sales_return"
    PURCHASE_RETURN = "purchase_return"
    STOCK_TRANSFER = "stock_transfer"
    CREDIT_NOTE = "credit_note"


class TxnReportReferenceType(str, Enum):
    CUSTOMER = "customer"
    SUPPLIER = "supplier"
    RECEIPT = "receipt"
    PAYMENT = "payment"
    TRANSFER = "transfer"


class TxnReportPaymentStatus(str, Enum):
    PAID = "paid"
    PARTIAL = "partial"
    UNPAID = "unpaid"
    N_A = "n_a"


class TxnReportTrendGranularity(str, Enum):
    DAILY = "daily"
    WEEKLY = "weekly"
    MONTHLY = "monthly"


class DeptReportView(str, Enum):
    SUMMARY = "summary"
    DETAILED = "detailed"


class DeptReportCompareWith(str, Enum):
    PREVIOUS_PERIOD = "previous_period"


class DeptReportSort(str, Enum):
    NAME = "name"
    TRANSACTIONS = "transactions"
    ISSUED = "issued"
    RECEIVED = "received"
    NET = "net"
    TOTAL = "total"


class CustomReportModule(str, Enum):
    TRANSACTIONS = "transactions"


class CustomReportField(str, Enum):
    DATE = "date"
    TRANSACTION_TYPE = "transaction_type"
    PARTY_NAME = "party_name"
    WAREHOUSE_NAME = "warehouse_name"
    PAYMENT_STATUS = "payment_status"
    REFERENCE_NO = "reference_no"
    REFERENCE_TYPE = "reference_type"


class CustomReportMetric(str, Enum):
    TOTAL_AMOUNT = "total_amount"
    QUANTITY = "quantity"
    TRANSACTIONS = "transactions"
    AVG_AMOUNT = "avg_amount"


class CustomReportSort(str, Enum):
    TOTAL_AMOUNT = "total_amount"
    QUANTITY = "quantity"
    TRANSACTIONS = "transactions"
    AVG_AMOUNT = "avg_amount"
    GROUP_KEY = "group_key"


class PermissionModule(str, Enum):
    DASHBOARD = "dashboard"
    ITEMS = "items"
    INVENTORY = "inventory"
    STOCK_TRANSFERS = "stock_transfers"
    WAREHOUSES = "warehouses"
    PURCHASES = "purchases"
    SALES = "sales"
    REPORTS = "reports"
    USERS_ROLES = "users_roles"
    SETTINGS = "settings"


class CompanyUserStatus(str, Enum):
    ACTIVE = "active"
    DISABLED = "disabled"


class UnitKind(str, Enum):
    INDIVIDUAL = "individual"
    PACK = "pack"


class WarehouseType(str, Enum):
    MAIN = "main"
    REGIONAL = "regional"
    BRANCH = "branch"


class WarehouseStatus(str, Enum):
    DRAFT = "draft"
    ACTIVE = "active"
    INACTIVE = "inactive"


class WarehousePriority(str, Enum):
    LOW = "low"
    NORMAL = "normal"
    HIGH = "high"


class StockTransferStatus(str, Enum):
    DRAFT = "draft"
    REVIEW = "review"
    APPROVED = "approved"
    PICK_PACK = "pick_pack"
    IN_TRANSIT = "in_transit"
    RECEIVE = "receive"
    COMPLETED = "completed"
    CANCELLED = "cancelled"


class StockTransferPriority(str, Enum):
    LOW = "low"
    NORMAL = "normal"
    HIGH = "high"


class StockTransferReason(str, Enum):
    STOCK_REBALANCING = "stock_rebalancing"
    BRANCH_REPLENISHMENT = "branch_replenishment"
    CUSTOMER_REQUEST = "customer_request"
    DAMAGE_REPLACEMENT = "damage_replacement"
    SEASONAL_DEMAND = "seasonal_demand"
    OTHER = "other"


class DepartmentStatus(str, Enum):
    DRAFT = "draft"
    ACTIVE = "active"
    INACTIVE = "inactive"


class LowStockAlertTarget(str, Enum):
    HEAD = "head"
    NOTIFY_EMAIL = "notify_email"
    BOTH = "both"
    NONE = "none"


class DepartmentIssueStatus(str, Enum):
    DRAFT = "draft"
    REVIEW = "review"
    APPROVED = "approved"
    ISSUE_ITEMS = "issue_items"
    COMPLETED = "completed"
    CANCELLED = "cancelled"


class DepartmentIssuePriority(str, Enum):
    LOW = "low"
    NORMAL = "normal"
    HIGH = "high"


class DepartmentIssueType(str, Enum):
    REGULAR = "regular"
    EMERGENCY = "emergency"
    PROJECT = "project"
    REPLACEMENT = "replacement"
    OTHER = "other"


class DepartmentIssueReason(str, Enum):
    DEPARTMENT_REQUEST = "department_request"
    MAINTENANCE = "maintenance"
    PROJECT_USE = "project_use"
    REPLACEMENT = "replacement"
    CONSUMABLE_REPLENISHMENT = "consumable_replenishment"
    OTHER = "other"


class PricingModel(str, Enum):
    FIXED = "fixed"
    AVERAGE_COST = "average_cost"
    LAST_PURCHASE = "last_purchase"


class InventoryTxnType(str, Enum):
    OPENING = "opening"
    PURCHASE_RECEIPT = "purchase_receipt"
    PURCHASE_RETURN = "purchase_return"
    SALE = "sale"
    ADJUSTMENT_IN = "adjustment_in"
    ADJUSTMENT_OUT = "adjustment_out"
    TRANSFER_IN = "transfer_in"
    TRANSFER_OUT = "transfer_out"
    ISSUE_TO_DEPARTMENT = "issue_to_department"


class InventoryTxnDirection(str, Enum):
    IN = "in"
    OUT = "out"


class ItemTransactionStatus(str, Enum):
    DRAFT = "draft"
    POSTED = "posted"
    CANCELLED = "cancelled"


class ItemTransactionReferenceType(str, Enum):
    PURCHASE_ORDER = "purchase_order"
    GOODS_RECEIPT = "goods_receipt"
    SALES_ORDER = "sales_order"
    SALES_DELIVERY = "sales_delivery"
    MANUAL = "manual"
    OTHER = "other"


class DocumentStatus(str, Enum):
    DRAFT = "draft"
    SUBMITTED = "submitted"
    APPROVED = "approved"
    PARTIALLY_RECEIVED = "partially_received"
    RECEIVED = "received"
    BILLED = "billed"
    PARTIALLY_PAID = "partially_paid"
    PAID = "paid"
    CANCELLED = "cancelled"
    POSTED = "posted"


class PurchaseOrderStatus(str, Enum):
    PENDING = "pending"
    CONFIRMED = "confirmed"
    PARTIALLY_RECEIVED = "partially_received"
    RECEIVED = "received"
    INVOICED = "invoiced"
    PARTIALLY_PAID = "partially_paid"
    PAID = "paid"
    CLOSED = "closed"
    CANCELLED = "cancelled"


class GrnStatus(str, Enum):
    DRAFT = "draft"
    CONFIRMED = "confirmed"
    CANCELLED = "cancelled"


class VendorBillStatus(str, Enum):
    DRAFT = "draft"
    POSTED = "posted"
    PARTIALLY_PAID = "partially_paid"
    PAID = "paid"
    CANCELLED = "cancelled"


class PurchasePaymentStatus(str, Enum):
    DRAFT = "draft"
    POSTED = "posted"
    CANCELLED = "cancelled"


class VendorBusinessType(str, Enum):
    MANUFACTURER = "manufacturer"
    WHOLESALER = "wholesaler"
    RETAILER = "retailer"
    DISTRIBUTOR = "distributor"
    SERVICE_PROVIDER = "service_provider"
    OTHER = "other"


class CustomerBusinessType(str, Enum):
    MANUFACTURER = "manufacturer"
    WHOLESALER = "wholesaler"
    RETAILER = "retailer"
    DISTRIBUTOR = "distributor"
    SERVICE_PROVIDER = "service_provider"
    OTHER = "other"


class SalesOrderStatus(str, Enum):
    DRAFT = "draft"
    CONFIRMED = "confirmed"
    AVAILABILITY_CHECKED = "availability_checked"
    RESERVED = "reserved"
    PICKED = "picked"
    PARTIALLY_SHIPPED = "partially_shipped"
    SHIPPED = "shipped"
    INVOICED = "invoiced"
    PARTIALLY_PAID = "partially_paid"
    PAID = "paid"
    CLOSED = "closed"
    CANCELLED = "cancelled"


class SalesDeliveryStatus(str, Enum):
    DRAFT = "draft"
    CONFIRMED = "confirmed"
    CANCELLED = "cancelled"


class SalesInvoiceStatus(str, Enum):
    DRAFT = "draft"
    POSTED = "posted"
    PARTIALLY_PAID = "partially_paid"
    PAID = "paid"
    CANCELLED = "cancelled"


class SalesPaymentStatus(str, Enum):
    DRAFT = "draft"
    POSTED = "posted"
    CANCELLED = "cancelled"


class PaymentTerms(str, Enum):
    COD = "cod"
    NET_15 = "net_15"
    NET_30 = "net_30"
    NET_45 = "net_45"
    NET_60 = "net_60"
    ADVANCE = "advance"


class PreferredPaymentMethod(str, Enum):
    CASH = "cash"
    BANK_TRANSFER = "bank_transfer"
    CHEQUE = "cheque"
    CREDIT_CARD = "credit_card"


class PurchaseType(str, Enum):
    LOCAL = "local"
    IMPORT = "import"
    SERVICE = "service"


class AmountType(str, Enum):
    PERCENT = "percent"
    AMOUNT = "amount"


class DateDisplayFormat(str, Enum):
    DD_MM_YYYY = "DD/MM/YYYY"
    MM_DD_YYYY = "MM/DD/YYYY"
    YYYY_MM_DD = "YYYY-MM-DD"
    DD_MM_YYYY_DASH = "DD-MM-YYYY"


class TimeDisplayFormat(str, Enum):
    HOUR_12 = "12h"
    HOUR_24 = "24h"


class SystemCurrency(str, Enum):
    PKR = "PKR"
    USD = "USD"
    EUR = "EUR"
    GBP = "GBP"
    AED = "AED"
    SAR = "SAR"
    INR = "INR"


class LandingPage(str, Enum):
    DASHBOARD = "dashboard"
    ITEMS = "items"
    INVENTORY = "inventory"
    PURCHASES = "purchases"
    SALES = "sales"
    REPORTS = "reports"
    SETTINGS = "settings"


class SystemLanguage(str, Enum):
    ENGLISH = "en"
    URDU = "ur"
    ARABIC = "ar"


class CompanyBusinessType(str, Enum):
    SOLE_PROPRIETORSHIP = "sole_proprietorship"
    PARTNERSHIP = "partnership"
    PRIVATE_LIMITED = "private_limited"
    PUBLIC_LIMITED = "public_limited"
    LLC = "llc"
    NGO = "ngo"
    GOVERNMENT = "government"
    OTHER = "other"


class CompanyIndustryType(str, Enum):
    RETAIL_DISTRIBUTION = "retail_distribution"
    MANUFACTURING = "manufacturing"
    WHOLESALE = "wholesale"
    SERVICES = "services"
    IT_SOFTWARE = "it_software"
    HEALTHCARE = "healthcare"
    CONSTRUCTION = "construction"
    AGRICULTURE = "agriculture"
    EDUCATION = "education"
    OTHER = "other"


class FiscalYearStart(str, Enum):
    JANUARY = "january"
    FEBRUARY = "february"
    MARCH = "march"
    APRIL = "april"
    MAY = "may"
    JUNE = "june"
    JULY = "july"
    AUGUST = "august"
    SEPTEMBER = "september"
    OCTOBER = "october"
    NOVEMBER = "november"
    DECEMBER = "december"


class CompanyTimeZone(str, Enum):
    ASIA_KARACHI = "Asia/Karachi"
    ASIA_DUBAI = "Asia/Dubai"
    ASIA_RIYADH = "Asia/Riyadh"
    ASIA_KOLKATA = "Asia/Kolkata"
    EUROPE_LONDON = "Europe/London"
    AMERICA_NEW_YORK = "America/New_York"
    UTC = "UTC"


class CompanyCountry(str, Enum):
    PAKISTAN = "PK"
    UNITED_ARAB_EMIRATES = "AE"
    SAUDI_ARABIA = "SA"
    INDIA = "IN"
    UNITED_STATES = "US"
    UNITED_KINGDOM = "GB"
    CHINA = "CN"
    OTHER = "OTHER"


def account_nature_for_type(account_type: AccountType) -> AccountNature:
    if account_type in (AccountType.ASSET, AccountType.EXPENSE):
        return AccountNature.DEBIT
    return AccountNature.CREDIT
