# -*- coding: utf-8 -*-
from django.shortcuts import render
from django.http import JsonResponse
from django.db import transaction

import json
import pandas as pd

from .models import CommercialOffer, CommercialOfferItem
from management.models import Good
from project.models import Project, ProjectItem

from .forms import UploadFileForm
from .filters import CommercialOfferFilter

from utils.utils import get_currency_exchange_from_nbu, split_string_into_name_and_units_of_measurement, _get_last_price_by_good_name
from action_history.views import user_action_audit, changes_history
from django.contrib.auth.decorators import login_required


@login_required(login_url='/login/')
def commercial_offer(request):
    if request.method == "GET": 
        exchangeRates_dollar, exchangedate_dollar, exchangeRates_euro, exchangedate_euro = get_currency_exchange_from_nbu()
        return render(request, 'commercial_offer/commercial_offer.html', context={'exchangeRates_dollar':exchangeRates_dollar, 
													"exchangedate_dollar":exchangedate_dollar,
													'exchangeRates_euro':exchangeRates_euro,
													"exchangedate_euro":exchangedate_euro
													})

@login_required(login_url='/login/')
def commercial_offer_list(request):
    """
    commercial offer list 
    """
    if request.method == "POST": 
        all_commercial_offers = CommercialOffer.objects.all()
        commercial_offers_filter = CommercialOfferFilter(request.POST, queryset = all_commercial_offers)
        commercial_offers = commercial_offers_filter.qs
        
        return render (request, 'commercial_offer/commercial_offer_list.html', context={'commercial_offers':commercial_offers, 
                                                                                        'commercial_offers_filter':commercial_offers_filter,
                                                                                        })
    
    if request.method == "GET": 
        count_all_commercial_offers = CommercialOffer.objects.all().count()
        commercial_offers = CommercialOffer.objects.all().order_by("-created_at")[:5]
        all_commercial_offers = CommercialOffer.objects.all().values('name')
        return render(request, 'commercial_offer/commercial_offer_list.html', context={"commercial_offers":commercial_offers, 
                                                                                    "all_commercial_offers":all_commercial_offers,
                                                                                    'count_all_commercial_offers':count_all_commercial_offers})

@login_required(login_url='/login/')        
def commercial_offer_detail(request, id):
    commercial_offer = CommercialOffer.objects.get(id= id)
    return render(request, 'commercial_offer/commercial_offer_detail.html', context={"commercial_offer":commercial_offer}) 

def commercial_offer_delete(request):
    try:
        data = json.loads(request.body)
        with transaction.atomic():
            commercial_offer = CommercialOffer.objects.get(id = data.get("data"))
            commercial_offer_items = CommercialOfferItem.objects.filter(commercial_offer = commercial_offer.id)
            for item in commercial_offer_items:
                item.delete()
            commercial_offer.delete()
            # action_history(request.user, f"Видалення КП {commercial_offer.name}", "OK")
            return JsonResponse({'message': 'Success'})
    except Exception as error:
        # action_history(request.user, f"Видалення КП {commercial_offer.name}", {error})
        return JsonResponse({'message': 'error','data':str(error)})
    
def get_last_price_by_good_name(request):
    try:
        data = json.loads(request.body)
        name= data.get("name")
        last_price =  _get_last_price_by_good_name(name)
        return JsonResponse({'message': 'Success', 'data':last_price})
    except Exception as error:
        return JsonResponse({'message': 'error','data':str(error)})
    
def save_commercial_offer(request):
    try:
        data = json.loads(request.body)
        with transaction.atomic():
            if CommercialOffer.objects.filter(name=data['co_name']).exists():
                commercial_offer =  CommercialOffer.objects.get(name=data['co_name'])
                commercial_offer.currency_euro = data['currency_euro']
                commercial_offer.currency_dollar = data['currency_dollar']
                commercial_offer.profitability = data['profitability']
                commercial_offer.created_by=str(request.user)
                commercial_offer.save()
                co = CommercialOfferItem.objects.filter(commercial_offer = commercial_offer.id)
                for item in co:
                    item.delete()
                for row in data['data']:
                    if row[0] == "Товар(ТМЦ)" or  row[0] == None:
                        continue
                    co_item = CommercialOfferItem.objects.create(
                                                    commercial_offer = CommercialOffer.objects.get(id = CommercialOffer.objects.get(name=data['co_name']).id),
                                                    good = row[0],
                                                    quantity = row[1],
                                                    price_uah = row[2],
                                                    price_euro = row[3],
                                                    price_dollar = row[4],
                                                    total = row[5]
                    )
                return JsonResponse({'message': 'Success'})
            else: 
                new_co = CommercialOffer.objects.create(
                            name=data['co_name'],
                            currency_euro = data['currency_euro'],
                            currency_dollar = data['currency_dollar'],
                            profitability = data['profitability'],
                            created_by=request.user
                        )
                user_action_audit(new_co.id ,"Створено", data['co_name'], request.user.email, "Ok")
                for row in data['data']:
                    if row[0] == "Товар(ТМЦ)" or  row[0] == None:
                        continue
                    commercial_offer = CommercialOffer.objects.get(id = new_co.id)
                    good = row[0]
                    quantity = row[1]
                    price_uah = row[2]
                    price_euro = row[3]
                    price_dollar = row[4]
                    total = row[5]
                    co_item = CommercialOfferItem.objects.create(
                                                    commercial_offer = commercial_offer,
                                                    good = good,
                                                    quantity = quantity,
                                                    price_uah = price_uah,
                                                    price_euro = price_euro,
                                                    price_dollar = price_dollar,
                                                    total = total
                    )
                    old_record = json.dumps({'good': '', 'quantity': 0.0})
                    new_value = CommercialOfferItem.objects.get(id=co_item.id)
                    new_record = json.dumps({'good': new_value.good, 'quantity': new_value.quantity})
                    changes_history("Додано", new_co.id, good, request.user, old_record, new_record)

                return JsonResponse({'message': 'Success'})
    except Exception as error:

        return JsonResponse({'message': 'error','data':str(error)})
    
def load_commercial_offer(request):
    try:
        data = json.loads(request.body)
        commercial_offer = CommercialOffer.objects.get(name= data['co_name'])
        commercial_offer_items = CommercialOfferItem.objects.filter(commercial_offer = commercial_offer.id).values('good','quantity','price_uah','price_euro','price_dollar','total')

        items_list = list(commercial_offer_items)
        
        return JsonResponse({'message': 'Success', 'data':items_list})
    except Exception as e:
        return JsonResponse({'message': 'Error', 'error': str(e)})
    
def load_commercial_offer_by_id(request):
    try:

        exchangeRates_dollar, exchangedate_dollar, exchangeRates_euro, exchangedate_euro = get_currency_exchange_from_nbu()
        data = json.loads(request.body)
        commercial_offer = CommercialOffer.objects.get(id= data['commercial_offer_id'])
        commercial_offer_items = CommercialOfferItem.objects.filter(commercial_offer = commercial_offer.id).values('good','quantity','price_uah','price_euro','price_dollar','total')
        for item in commercial_offer_items:
            good_name = item["good"]
            item["quantity"] = 0
            item["price_uah"] = _get_last_price_by_good_name(good_name) or 0
            item["price_euro"] = float(item["price_uah"]) * float(exchangeRates_euro) or 0
            item["price_dollar"] = float(item["price_uah"]) * float(exchangeRates_dollar) or 0
            item["total"] = 0

        items_list = list(commercial_offer_items)
        return JsonResponse({'message': 'Success', 'data':items_list})      
    except Exception as e:
        return JsonResponse({'message': 'Error', 'error': str(e)})

def copy_commercial_offer_by_id(request):
    try:
        exchangeRates_dollar, exchangedate_dollar, exchangeRates_euro, exchangedate_euro = get_currency_exchange_from_nbu()
        return render(request, 'commercial_offer/commercial_offer_for_copy.html', context={'exchangeRates_dollar':exchangeRates_dollar, 
													"exchangedate_dollar":exchangedate_dollar,
													'exchangeRates_euro':exchangeRates_euro,
													"exchangedate_euro":exchangedate_euro
													})

    except Exception as e:
        return JsonResponse({'message': 'Error', 'error': str(e)})

def move_commercial_offer_to_project(request):
    try:
        data = json.loads(request.body)
        commercial_offer_id =  data['data']
        project_name = data['project_name']
        project = Project.objects.filter(name = project_name).exists()
        if project:
            return JsonResponse({'message': 'Error', 'data': str('Обьєкт з такою назвою вже додано, оберіть іншу назву')})
        with transaction.atomic():
            project = Project.objects.create(name = project_name, created_by = request.user)
            commercial_offer_items = CommercialOfferItem.objects.filter(commercial_offer = commercial_offer_id).values('good','quantity')
            for item in commercial_offer_items:
                name= item['good']
                good_name , unit_of_measurement = split_string_into_name_and_units_of_measurement(name)
                if Good.objects.filter(name=good_name,unit_of_measurement=unit_of_measurement).exists():
                    good = Good.objects.get(name=good_name,unit_of_measurement=unit_of_measurement)
                    project_item = ProjectItem.objects.create(
                                                    project = project,
                                                    good = good,
                                                    quantity = float(item['quantity']),
                    )
                else:
                    raise ValueError(f"Товар {good_name} відсутній в базі") 
        
            # action_history(request.user, f"Переміщення КП в обьєкт {project_name}", "OK")
            return JsonResponse({'message': 'Success'})
    except Exception as error:
        # action_history(request.user, f"Переміщення КП в обьєкт {project_name}", error)
        return JsonResponse({'message': 'Error', 'data': str(error)})
    
def export_commercial_offer_to_excel(request):
    try:
        from io import BytesIO
        from django.http import HttpResponse

        data = json.loads(request.body)
        commercial_offer_id =  data['commercial_offer_id']
        commercial_offer_name =  data['co_name']
        
        df = pd.DataFrame(
            list(
                CommercialOfferItem.objects.filter(
                    commercial_offer=commercial_offer_id
                ).values('good', 'quantity', 'price_uah', 'price_euro', 'price_dollar', 'total')
            )
        )
        
        split_columns = df['good'].apply(split_string_into_name_and_units_of_measurement).apply(pd.Series)
        df = pd.concat([split_columns, df], axis=1)
        df = df.drop('good', axis=1)

        df = df.rename(columns={0: "Назва",1:"Одиниці", "quantity": "Кількість", 'price_uah':'Ціна, грн', 'price_euro':'Ціна, евро', 'price_dollar':'Ціна, доллар',  'total':'Сумма, грн' })
        with BytesIO() as b:
            with pd.ExcelWriter(b, engine='xlsxwriter') as writer:
                df.to_excel(writer, sheet_name='Sheet1', index=False)
            response = HttpResponse(
                b.getvalue(),
                content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
            )
            response['Content-Disposition'] = 'attachment; filename="exported_data.xlsx"'
            
            # action_history(request.user, f"Еспорт КП {commercial_offer_name} в excel", "OK")
            return response

    except Exception as error:
        # action_history(request.user, f"Еспорт КП {commercial_offer_name} в excel", error)
        return JsonResponse({'message': 'error','data':str(error)})
    
def get_data_from_template_file_commercial_offer(request):
    try:
        if request.method == 'POST':
            upload_form = UploadFileForm(request.POST, request.FILES)
            if upload_form.is_valid():
                filename = request.FILES['file']
                df = pd.read_excel(filename, skiprows=0)
                commercial_offer_items = df.to_dict(orient='records')
                exchangeRates_dollar, exchangedate_dollar, exchangeRates_euro, exchangedate_euro = get_currency_exchange_from_nbu()
                data_for_backend = []
                for item in commercial_offer_items:
                    val = {}
                    good_name = f"{item['Товар(ТМЦ)']}>>{item['Одиниці']}"
                    val["good"] =  good_name
                    val["quantity"] = item['Кількість'] or 0
                    val["price_uah"] = _get_last_price_by_good_name(good_name)
                    val["price_euro"] = float(val["price_uah"]) * float(exchangeRates_euro) or 0
                    val["price_dollar"] = float(val["price_uah"]) * float(exchangeRates_dollar) or 0
                    val["total"] = float(val["price_uah"]) * float(val["quantity"]) or 0
                    data_for_backend.append(val)

                return JsonResponse({'message': 'Success', 'data':data_for_backend})
    except Exception as error:
        return JsonResponse({'message': 'error', 'data':str('впевніться що ви обрали правильний файл')})
