# -*- coding: utf-8 -*-
from django.db import models
from management.models import StorageFacility, Good
from datetime import datetime
from django.contrib.auth.models import User
import uuid

from project.models import Project


class ReceiptItem(models.Model):
    id = models.CharField(max_length=40 ,primary_key=True, default=uuid.uuid4, editable=False)
    receipt = models.ForeignKey('Receipt', on_delete=models.SET_NULL, null=True, verbose_name='Накладна')
    good = models.ForeignKey(Good, on_delete=models.SET_NULL, null=True, verbose_name='Товар')
    quantity = models.FloatField(verbose_name='Кількість')
    price = models.FloatField(verbose_name='Ціна')
    total = models.FloatField(verbose_name='Сума')
    date = models.DateField(default=datetime.now, verbose_name='Дата отримання')
    created_at = models.DateField(auto_now_add=True, verbose_name='Дата створення')
    created_by = models.CharField(max_length=200, verbose_name='Користувач', default='System')

    def __str__(self):
        return f"{self.good}"

    class Meta:
        verbose_name_plural = 'Товари в накладній'


class Receipt(models.Model):
    id = models.CharField(max_length=40 ,primary_key=True, default=uuid.uuid4, editable=False)
    vendor = models.CharField(max_length=255, verbose_name='Постачальник')
    invoice = models.CharField(max_length=50, verbose_name='№ Накладної')
    date = models.DateField(default=datetime.now, verbose_name='Дата отримання')
    storage_facility = models.ForeignKey(StorageFacility, on_delete=models.SET_NULL, null=True, verbose_name='Склад')
    receipt_item = models.ManyToManyField(ReceiptItem,  related_name='receipt_item', verbose_name='Товари')
    comment = models.TextField(blank=True, null=True, verbose_name='Коментар')
    created_at = models.DateTimeField(auto_now_add=True, verbose_name='Дата створення')
    created_by = models.CharField(max_length=200, verbose_name='Користувач', default='System')
    is_delete  = models.BooleanField(default=False, verbose_name='Видалено')

    class Meta:
        verbose_name = 'Оприбуткування'
        verbose_name_plural = 'Оприбуткування'
    
    def __str__(self):
        """
        String for representing the Model object (in Admin site etc.)
        """
        return self.vendor
    
   
class Stock(models.Model):
    id = models.CharField(max_length=40 ,primary_key=True, default=uuid.uuid4, editable=False)
    good_id = models.ForeignKey(Good, on_delete=models.SET_NULL, null=True ,verbose_name='Товар')
    storage_facility_id = models.ForeignKey(StorageFacility, on_delete=models.SET_NULL, null=True, verbose_name='Склад')
    quantity = models.FloatField(default=0, verbose_name='Кількість')
    actual_quantity = models.FloatField(default=0, verbose_name='Актуальна кількість')
    date = models.DateTimeField(auto_now_add=True, verbose_name='Дата')
    price = models.FloatField(verbose_name='Ціна')
    receipt = models.ForeignKey('Receipt', on_delete=models.CASCADE, null=True, verbose_name='Накладна')

    def __str__(self):
        return f"{self.good_id}"
    


class Reservation(models.Model):
    id = models.CharField(max_length=40 ,primary_key=True, default=uuid.uuid4, editable=False)
    project = models.ForeignKey(Project, on_delete=models.CASCADE, null=True ,verbose_name='Проект')
    good = models.ForeignKey(Good, on_delete=models.CASCADE, null=True ,verbose_name='Товар')
    quantity = models.FloatField(default=0, verbose_name='Кількість')
    date = models.DateTimeField(auto_now_add=True, verbose_name='Дата')
    created_by = models.CharField(max_length=200, verbose_name='Користувач', default='System')
    def __str__(self):
        return f"{self.project} === {self.good}"
    


class InvoiceWritingOffMaterial(models.Model):
    id = models.CharField(max_length=40 ,primary_key=True, default=uuid.uuid4, editable=False)
    invoice = models.IntegerField(verbose_name='№ Акту')
    reason = models.TextField(verbose_name='Причина списання', null=True)
    project = models.ForeignKey(Project, on_delete=models.CASCADE, null=True ,verbose_name='Проект')
    total_sum = models.FloatField(default=0, verbose_name='Сумма')
    date = models.DateField(default=datetime.now, verbose_name='Дата створення')
    created_at = models.DateTimeField(auto_now_add=True, verbose_name='Дата')
    created_by = models.CharField(max_length=200, verbose_name='Користувач', default='System')
    is_delete  = models.BooleanField(default=False, verbose_name='Видалено')


class WritingOffMaterialsItem(models.Model):
    id = models.CharField(max_length=40 ,primary_key=True, default=uuid.uuid4, editable=False)
    invoice = models.ForeignKey('InvoiceWritingOffMaterial', on_delete=models.CASCADE, null=True, verbose_name='№ Акту')
    good = models.ForeignKey(Good, on_delete=models.CASCADE, null=True, verbose_name='Товар')
    quantity = models.FloatField(verbose_name='Кількість')
    price = models.FloatField(default=0, verbose_name='Ціна')
    identifier_write_off = models.CharField(max_length=40, null=True)
    created_at = models.DateTimeField(auto_now_add=True, verbose_name='Дата', null=True)




class WriteOff(models.Model):
    id = models.CharField(max_length=40 ,primary_key=True, default=uuid.uuid4, editable=False)
    good = models.ForeignKey(Good, on_delete=models.CASCADE, verbose_name='Товар')
    quantity = models.FloatField(verbose_name='Кількість')
    reason = models.TextField(verbose_name='Причина списання')
    date = models.DateTimeField(auto_now_add=True, verbose_name='Дата списання')
    created_by = models.CharField(max_length=200, verbose_name='Користувач', default='System')

    def __str__(self):
        return f"{self.good.name} - {self.quantity} шт. ({self.date})"
    


class AdditionalPurchases(models.Model):
    id = models.CharField(max_length=40 ,primary_key=True, default=uuid.uuid4, editable=False)
    project = models.ForeignKey(Project, on_delete=models.CASCADE, null=True ,verbose_name='Проект')
    name = models.TextField(verbose_name='Назва')
    unit_of_measurement = models.CharField(max_length=50, verbose_name='Одиниця виміру')
    quantity = models.FloatField(verbose_name='Кількість')
    price = models.FloatField(default=0, verbose_name='Ціна')
    utilized = models.FloatField(default=0, verbose_name='Використанно')
    date = models.DateTimeField(auto_now_add=True, verbose_name='Дата')
    created_by = models.CharField(max_length=200, verbose_name='Користувач', default='System')



#  Переміщення між складами
class InvoiceMovementMaterial(models.Model):
    id = models.CharField(max_length=40 ,primary_key=True, default=uuid.uuid4, editable=False)
    invoice = models.IntegerField(verbose_name='№ Акту')
    created_at = models.DateTimeField(auto_now_add=True, verbose_name='Дата')
    created_by = models.CharField(max_length=200, verbose_name='Користувач', default='System')
    is_delete  = models.BooleanField(default=False, verbose_name='Видалено')
    storage_from = models.CharField(max_length=200, verbose_name='Зі складу', blank = True, null=True)
    storage_to = models.CharField(max_length=200, verbose_name='На склад', blank = True, null=True)


class MovementMaterialsItem(models.Model):
    id = models.CharField(max_length=40 ,primary_key=True, default=uuid.uuid4, editable=False)
    invoice = models.ForeignKey('InvoiceMovementMaterial', on_delete=models.CASCADE, null=True, verbose_name='№ Акту')
    good = models.ForeignKey(Good, on_delete=models.CASCADE, null=True, verbose_name='Товар')
    quantity = models.FloatField(verbose_name='Кількість')
    price = models.FloatField(default=0, verbose_name='Ціна')
    identifier_write_off = models.CharField(max_length=40, null=True)
    created_at = models.DateTimeField(auto_now_add=True, verbose_name='Дата', null=True)