from django.db import models
from user.models import Child, Parent
from basic.models import Language

class Currency(models.Model):
    symbol = models.TextField(null=True, blank=True)
    code = models.TextField(null=True, blank=True)
    isEnabled = models.BooleanField(default=False)
    createdDate = models.DateTimeField(null=True, blank=True)
    updatedDate = models.DateTimeField(null=True, blank=True)

class CurrencyLanguage(models.Model):
    name = models.TextField(null=True, blank=True)
    createdDate = models.DateTimeField(null=True, blank=True)
    updatedDate = models.DateTimeField(null=True, blank=True)
    languageId = models.ForeignKey(
        Language,
        on_delete=models.CASCADE,
        related_name="language_currencylanguage",
    )
    currencyId = models.ForeignKey(
        Currency,
        on_delete=models.CASCADE,
        related_name="currency_currencylanguage",
    )

class PaymentMethod(models.Model):
    isEnabled = models.BooleanField(default=False)
    keyName = models.TextField(null=True, blank=True)
    createdDate = models.DateTimeField(null=True, blank=True)
    updatedDate = models.DateTimeField(null=True, blank=True)

class PaymentMethodLanguage(models.Model):
    name = models.TextField(null=True, blank=True)
    createdDate = models.DateTimeField(null=True, blank=True)
    updatedDate = models.DateTimeField(null=True, blank=True)
    languageId = models.ForeignKey(
        Language,
        on_delete=models.CASCADE,
        related_name="language_paymentmethodlanguage",
    )
    paymentMethodId = models.ForeignKey(
        PaymentMethod,
        on_delete=models.CASCADE,
        related_name="paymentmethod_paymentmethodlanguage",
    )

class Store(models.Model):
    keyName = models.TextField(null=True, blank=True)
    createdDate = models.DateTimeField(null=True, blank=True)
    updatedDate = models.DateTimeField(null=True, blank=True)
    currencyId = models.ForeignKey(
        Currency,
        on_delete=models.CASCADE,
        related_name="currency_store",
    )

class StoreLanguage(models.Model):
    name = models.TextField(null=True, blank=True)
    createdDate = models.DateTimeField(null=True, blank=True)
    updatedDate = models.DateTimeField(null=True, blank=True)
    languageId = models.ForeignKey(
        Language,
        on_delete=models.CASCADE,
        related_name="language_storelanguage",
    )
    storeId = models.ForeignKey(
        Store,
        on_delete=models.CASCADE,
        related_name="store_storelanguage",
    )

class ShoppingAccount(models.Model):
    isSelected = models.BooleanField(default=False)
    createdDate = models.DateTimeField(null=True, blank=True)
    updatedDate = models.DateTimeField(null=True, blank=True)
    parentId = models.ForeignKey(
        Parent,
        on_delete=models.CASCADE,
        related_name="parent_shoppingaccount",
    )
    storeId = models.ForeignKey(
        Store,
        on_delete=models.CASCADE,
        related_name="store_shoppingaccount",
    )

class AddressBook(models.Model):
    phone = models.TextField()
    country = models.TextField()
    city = models.TextField()
    address = models.TextField()
    postCode = models.TextField(null=True, blank=True)
    isSelected = models.BooleanField(default=False)
    shoppingAccountId = models.ForeignKey(
        ShoppingAccount,
        on_delete=models.CASCADE,
        related_name="shoppingaccount_addressbook",
    )

class Collection(models.Model):
    keyName = models.TextField(null=True, blank=True)
    createdDate = models.DateTimeField(null=True, blank=True)
    updatedDate = models.DateTimeField(null=True, blank=True)
    collectionId = models.ForeignKey(
        "self",
        on_delete=models.CASCADE,
        related_name="collecion_subcollection",
        blank=True,
        null=True
    )

class CollectionLanguage(models.Model):
    name = models.TextField(null=True, blank=True)
    createdDate = models.DateTimeField(null=True, blank=True)
    updatedDate = models.DateTimeField(null=True, blank=True)
    languageId = models.ForeignKey(
        Language,
        on_delete=models.CASCADE,
        related_name="language_collectionlanguage",
    )
    collectionId = models.ForeignKey(
        Collection,
        on_delete=models.CASCADE,
        related_name="collection_collectionlanguage",
    )

class StoreCollection(models.Model):
    collectionId = models.ForeignKey(
        Collection,
        on_delete=models.CASCADE,
        related_name="collection_storecollection",
    )
    storeId = models.ForeignKey(
        Store,
        on_delete=models.CASCADE,
        related_name="store_storecollection",
    )

class SellerShippingCost(models.Model):
    keyName = models.TextField(null=True, blank=True)
    createdDate = models.DateTimeField(null=True, blank=True)
    updatedDate = models.DateTimeField(null=True, blank=True)

class Product(models.Model):
    keyName = models.TextField(null=True, blank=True)
    isDigital = models.BooleanField(default=False)
    isFree = models.BooleanField(default=False)
    isVisible = models.BooleanField(default=True)
    createdDate = models.DateTimeField(null=True, blank=True)
    updatedDate = models.DateTimeField(null=True, blank=True)

class ProductLanguage(models.Model):
    name = models.TextField(null=True, blank=True)
    description = models.TextField(null=True, blank=True)
    createdDate = models.DateTimeField(null=True, blank=True)
    updatedDate = models.DateTimeField(null=True, blank=True)
    languageId = models.ForeignKey(
        Language,
        on_delete=models.CASCADE,
        related_name="language_productlanguage",
    )
    productId = models.ForeignKey(
        Product,
        on_delete=models.CASCADE,
        related_name="product_productlanguage",
    )

class ProductCollection(models.Model):
    createdDate = models.DateTimeField(null=True, blank=True)
    updatedDate = models.DateTimeField(null=True, blank=True)
    productId = models.ForeignKey(
        Product,
        on_delete=models.CASCADE,
        related_name="product_productcollection",
    )
    collectionId = models.ForeignKey(
        Collection,
        on_delete=models.CASCADE,
        related_name="collection_productcollection",
    )

class ProductOption(models.Model):
    keyName = models.TextField(null=True, blank=True)
    createdDate = models.DateTimeField(null=True, blank=True)
    updatedDate = models.DateTimeField(null=True, blank=True)
    productId = models.ForeignKey(
        Product,
        on_delete=models.CASCADE,
        related_name="product_productoption",
    )

class ProductOptionLanguage(models.Model):
    name = models.TextField(null=True, blank=True)
    createdDate = models.DateTimeField(null=True, blank=True)
    updatedDate = models.DateTimeField(null=True, blank=True)
    languageId = models.ForeignKey(
        Language,
        on_delete=models.CASCADE,
        related_name="language_productoptionlanguage",
    )
    productOptionId = models.ForeignKey(
        ProductOption,
        on_delete=models.CASCADE,
        related_name="productoption_productoptionlanguage",
    )

class ProductOptionValue(models.Model):
    keyName = models.TextField(null=True, blank=True)
    value = models.TextField(null=True, blank=True)
    createdDate = models.DateTimeField(null=True, blank=True)
    updatedDate = models.DateTimeField(null=True, blank=True)
    productOptionId = models.ForeignKey(
        ProductOption,
        on_delete=models.CASCADE,
        related_name="productoption_productoptionvalue",
    )

class ProductOptionValueLanguage(models.Model):
    name = models.TextField(null=True, blank=True)
    createdDate = models.DateTimeField(null=True, blank=True)
    updatedDate = models.DateTimeField(null=True, blank=True)
    languageId = models.ForeignKey(
        Language,
        on_delete=models.CASCADE,
        related_name="language_productoptionvaluelanguage",
    )
    productOptionValueId = models.ForeignKey(
        ProductOptionValue,
        on_delete=models.CASCADE,
        related_name="productoptionvalue_productoptionvaluelanguage",
    )

class SKU(models.Model):
    serial = models.TextField(null=True, blank=True)
    stock = models.IntegerField(null=True, blank=True)
    createdDate = models.DateTimeField(null=True, blank=True)
    updatedDate = models.DateTimeField(null=True, blank=True)
    productId = models.ForeignKey(
        Product,
        on_delete=models.CASCADE,
        related_name="product_sku",
    )

class SKUOptionValue(models.Model):
    createdDate = models.DateTimeField(null=True, blank=True)
    updatedDate = models.DateTimeField(null=True, blank=True)
    productOptionValueId = models.ForeignKey(
        ProductOptionValue,
        on_delete=models.CASCADE,
        related_name="productoptionvalue_skuoptionvalue",
    )
    skuId = models.ForeignKey(
        SKU,
        on_delete=models.CASCADE,
        related_name="sku_skuoptionvalue",
    )

class SKUImage(models.Model):
    imageUrl = models.TextField(null=True, blank=True)
    createdDate = models.DateTimeField(null=True, blank=True)
    updatedDate = models.DateTimeField(null=True, blank=True)
    skuId = models.ForeignKey(
        SKU,
        on_delete=models.CASCADE,
        related_name="sku_skuimage",
    )

class SKUPrice(models.Model):
    salePrice = models.FloatField(null=True, blank=True)
    originalPrice = models.FloatField(null=True, blank=True)
    createdDate = models.DateTimeField(null=True, blank=True)
    updatedDate = models.DateTimeField(null=True, blank=True)
    currencyId = models.ForeignKey(
        Currency,
        on_delete=models.CASCADE,
        related_name="currency_skuprice",
    )
    skuId = models.ForeignKey(
        SKU,
        on_delete=models.CASCADE,
        related_name="sku_skuprice",
    )

class ShippingCost(models.Model):
    isFreeShipping = models.BooleanField(default=False)
    minDeliveryDays = models.IntegerField(null=True, blank=True)
    maxDeliveryDays = models.IntegerField(null=True, blank=True)
    cost = models.FloatField(default=0.0)
    defaultCost = models.FloatField(default=0.0)
    createdDate = models.DateTimeField(null=True, blank=True)
    updatedDate = models.DateTimeField(null=True, blank=True)
    skuPriceId = models.ForeignKey(
        SKUPrice,
        on_delete=models.CASCADE,
        related_name="skuprice_shippingcost",
    )
    sellerShippingCostId = models.ForeignKey(
        SellerShippingCost,
        on_delete=models.CASCADE,
        related_name="sellershippingcost_shippingcost",
    )

class Cart(models.Model):
    quantity = models.IntegerField(default=1)
    createdDate = models.DateTimeField(null=True, blank=True)
    updatedDate = models.DateTimeField(null=True, blank=True)
    skuId = models.ForeignKey(
        SKU,
        on_delete=models.CASCADE,
        related_name="sku_cart",
    )
    shoppingAccountId = models.ForeignKey(
        ShoppingAccount,
        on_delete=models.CASCADE,
        related_name="shoppingaccount_cart",
    )

class OrderStatus(models.Model):
    keyName = models.TextField(null=True, blank=True)
    createdDate = models.DateTimeField(null=True, blank=True)
    updatedDate = models.DateTimeField(null=True, blank=True)

class OrderStatusLanguage(models.Model):
    name = models.TextField(null=True, blank=True)
    createdDate = models.DateTimeField(null=True, blank=True)
    updatedDate = models.DateTimeField(null=True, blank=True)
    languageId = models.ForeignKey(
        Language,
        on_delete=models.CASCADE,
        related_name="language_orderstatuslanguage",
    )
    orderStatusId = models.ForeignKey(
        OrderStatus,
        on_delete=models.CASCADE,
        related_name="orderstatus_orderstatuslanguage",
    )

class Order(models.Model):
    delivery = models.FloatField(null=True, blank=True)
    tax = models.FloatField(null=True, blank=True)
    createdDate = models.DateTimeField(null=True, blank=True)
    updatedDate = models.DateTimeField(null=True, blank=True)
    orderStatusId = models.ForeignKey(
        OrderStatus,
        on_delete=models.CASCADE,
        related_name="orderstatus_order",
    )
    paymentMethodId = models.ForeignKey(
        PaymentMethod,
        on_delete=models.CASCADE,
        related_name="paymentmethod_order",
    )
    storeId = models.ForeignKey(
        Store,
        on_delete=models.CASCADE,
        related_name="store_order",
    )
    shoppingAccountId = models.ForeignKey(
        ShoppingAccount,
        on_delete=models.CASCADE,
        related_name="shoppingaccount_order",
    )

class OrderItem(models.Model):
    pricePerItem = models.FloatField(null=True, blank=True)
    originalPricePerItem = models.FloatField(null=True, blank=True,default=0.0)
    shippingCost = models.FloatField(default=0.0)
    quantity = models.IntegerField(null=True, blank=True)
    createdDate = models.DateTimeField(null=True, blank=True)
    updatedDate = models.DateTimeField(null=True, blank=True)
    skuId = models.ForeignKey(
        SKU,
        on_delete=models.CASCADE,
        related_name="sku_orderitem",
    )
    
    orderId = models.ForeignKey(
        Order,
        on_delete=models.CASCADE,
        related_name="order_orderitem",
    )
    currencyId = models.ForeignKey(
        Currency,
        on_delete=models.CASCADE,
        related_name="currency_orderitem",
    )

class ShippingAddress(models.Model):
    phone = models.TextField()
    country = models.TextField()
    city = models.TextField()
    address = models.TextField()
    postCode = models.TextField(null=True, blank=True)
    createdDate = models.DateTimeField(null=True, blank=True)
    updatedDate = models.DateTimeField(null=True, blank=True)
    orderId = models.ForeignKey(
        Order,
        on_delete=models.CASCADE,
        related_name="order_shippingaddress",
    )
