from django.contrib.auth.decorators import login_required
from django.shortcuts import render, redirect
from django.utils import timezone
from django.contrib import messages
from otentifikasi.models import MenuItem
from pelayanan.models import TarifLayanan, TarifLab, InvoiceLayanan, InvoiceLab
from penjualan.models import Barang, InvoiceBarang
from pembayaran.models import Pembayaran
from .models import PromotionVoucher, PromotionVoucherHistory, PromotionDiskon, PromotionDiskonHistory
from django.http import JsonResponse
import json
from datetime import date, datetime
from django.db.models import Subquery

# Create your views here.

def formatNum(number):
    try:
        # Convert the input to a float (assuming it's a valid number format)
        number = float(number)
        # Format the number with commas
        formatted_number = "{:,.0f}".format(number)
        return formatted_number
    except ValueError:
        return "Invalid number format"

@login_required
def daftar_voucher(request):
    voucherlist = PromotionVoucher.objects.all()
    for item in voucherlist:
        current_time = datetime.now(timezone.utc)
        if item.expired_at < current_time:
            PromotionVoucher.objects.filter(id=item.id).update(is_active=0)


    voucherlisthistory = PromotionVoucherHistory.objects.all()
    user_groups = request.user.groups.all()
    # GET MENU BY GROUPS #RYDEV
    menu_items = MenuItem.objects.filter(auth_menu_access__group__in=user_groups).order_by('order').distinct()
    context = {
        'voucherlist': voucherlist,
        'voucherlisthistory': voucherlisthistory,
        'menu_items': menu_items,
    }
    return render(request, 'promotion/voucher/daftar_voucher.html', context)

@login_required
def tambah_voucher(request):
    data = request.POST
    kode = data.get('kode')
    diskon = data.get('diskon')
    tipe = data.get('tipe_diskon')
    kuota = data.get('kuota')
    min_pembayaran = data.get('min_pembayaran')
    is_active = data.get('is_active')
    created_by = request.user.first_name
    expired_at = data.get('expired_at')

    if tipe == "on":
        tipe_diskon = "%"
    else:
        tipe_diskon = "rp"

    create = PromotionVoucher(
        kode=kode,
        diskon=diskon,
        tipe_diskon=tipe_diskon,
        min_pembayaran=min_pembayaran,
        kuota=kuota,
        kuota_terpakai=0,
        is_active=1,
        created_by=created_by,
        expired_at=expired_at,
        created_at=timezone.now()
    )
    create.save()
    messages.success(request, 'Voucher berhasil ditambahkan!')
    return redirect('/promotion/daftar_voucher')

@login_required
def check_voucher(request):
    current_date = timezone.now()
    formatted_date = current_date.strftime('%Y-%m-%d')
    id = request.POST.get('id')
    pembayaran = Pembayaran.objects.get(pendaftaran_id=id)
    total_bayar = pembayaran.total_pembayaran
    try:
        code = request.POST.get('code')
        voucher = PromotionVoucher.objects.get(kode=code)

        expired = voucher.expired_at.strftime('%Y-%m-%d')
        if expired < formatted_date:
            result = {
                'status_code': 400,
                'msg': "Voucher telah kadaluarsa!",
            }
            return JsonResponse(result, safe=False)

        if voucher.is_active != 1:
            result = {
                'status_code': 400,
                'msg': "Voucher tidak dapat digunakan!",
            }
            return JsonResponse(result, safe=False)

        if voucher.kuota_terpakai >= voucher.kuota:
            result = {
                'status_code': 400,
                'msg': "Voucher telah melebihi kuota pemakaian!",
            }
            return JsonResponse(result, safe=False)

        if voucher.min_pembayaran >= total_bayar:
            formattedPembayaran = locale.currency(voucher.min_pembayaran, grouping=True)
            result = {
                'status_code': 400,
                'msg': f"Total pembayaran harus melebihi {formattedPembayaran}",
            }
            return JsonResponse(result, safe=False)
            
        if not PromotionVoucherHistory.objects.filter(pendaftaran_id=id).exists():
            voucher_history = PromotionVoucherHistory(
                voucher=voucher,
                pendaftaran_id=id,
                pembayaran=pembayaran,
                status=0,
                created_at=formatted_date,
                updated_at=formatted_date,
            )
            voucher_history.save()

        if voucher.tipe_diskon == '%':
            diskon = voucher.diskon + ' %'
            potongan = total_bayar * (int(voucher.diskon) / 100)
            after_diskon = total_bayar - potongan
        else:
            after_diskon = total_bayar - int(voucher.diskon)
            diskon = "- " + voucher.diskon
        
        result = {
            'status_code': 200,
            'status': 'Voucher berhasil digunakan.',
            'diskon': diskon,
            'after_diskon': after_diskon,
        }

        # UPDATE STATUS LAYANAN, OBAT, LAB
        InvoiceLayanan.objects.filter(pendaftaran_id=id).update(is_dibayar=0)
        InvoiceLab.objects.filter(pendaftaran_id=id).update(is_dibayar=0)
        InvoiceBarang.objects.filter(pendaftaran_id=id).update(is_dibayar=0)

        pembayaran.kembalian = 0
        pembayaran.uang_pasien= 0
        pembayaran.is_dibayar= 0
        pembayaran.save()

        terpakai = voucher.kuota_terpakai + 1
        PromotionVoucher.objects.filter(kode=code).update(kuota_terpakai=terpakai)

        return JsonResponse(result, safe=False)
    except PromotionVoucher.DoesNotExist:
        result = {
            'status_code': 400,
            'msg': 'Voucher tidak tersedia',
            'diskon': "0 %",
            'after_diskon': total_bayar,
        }
        return JsonResponse(result, safe=False)

@login_required
def hapus_voucher(request):
    pendaftaran_id = request.POST.get('id')
    voucher_history = PromotionVoucherHistory.objects.get(pendaftaran_id=pendaftaran_id)
    voucher = PromotionVoucher.objects.get(kode=voucher_history.voucher.kode)

    if Pembayaran.objects.filter(pendaftaran_id=pendaftaran_id).exists():
        update = Pembayaran.objects.get(pendaftaran_id=pendaftaran_id)
        update.kembalian = 0
        update.uang_pasien= 0
        update.is_dibayar= 0
        update.save()

    # UPDATE STATUS LAYANAN, OBAT, LAB
    InvoiceLayanan.objects.filter(pendaftaran_id=pendaftaran_id).update(is_dibayar=0)
    InvoiceLab.objects.filter(pendaftaran_id=pendaftaran_id).update(is_dibayar=0)
    InvoiceBarang.objects.filter(pendaftaran_id=pendaftaran_id).update(is_dibayar=0)

    if voucher.kuota_terpakai != 0:
        voucher.is_active = 1
        voucher.kuota_terpakai -= 1
        voucher.save()
    
    voucher_history.delete()

    result = {
        'status_code': 200,
        'status': 'Voucher berhasil dihapus'
    }
    return JsonResponse(result, safe=False)

@login_required
def get_obat(request):
    obat = Barang.objects.all()
    obat_data = {
        'text': 'OBAT',
        'children': [{'id': 'O-'+str(item.id), 'text': item.nama+' - Rp'+formatNum(item.harga_jual)} for item in obat]
    }
    return JsonResponse(obat_data)

@login_required
def get_tindakan(request):
    tindakan = TarifLayanan.objects.all()
    tindakan_data = {
        'text': 'TINDAKAN',
        'children': [{'id': 'T-'+str(item.id), 'text': item.nama+' - Rp'+formatNum(item.harga)} for item in tindakan]
    }
    return JsonResponse(tindakan_data)

@login_required
def get_tindakan_lab(request):
    tindakan_lab = TarifLab.objects.all()
    tindakan_data = {
        'text': 'TINDAKAN LAB',
        'children': [{'id': 'TL-'+str(item.id), 'text': item.nama+' - Rp'+formatNum(item.harga)} for item in tindakan_lab]
    }
    return JsonResponse(tindakan_data)

@login_required
def daftar_diskon(request):
    diskonlist = PromotionDiskon.objects.all()
    for item in diskonlist:
        current_date = date.today()
        if item.expired_at < current_date:
            PromotionDiskon.objects.filter(id=item.id).update(is_active=0)

    diskonlisthistory = InvoiceLayanan.objects.filter(diskon_pembelian__isnull=False)
    user_groups = request.user.groups.all()
    # GET MENU BY GROUPS #RYDEV
    menu_items = MenuItem.objects.filter(auth_menu_access__group__in=user_groups).order_by('order').distinct()
    context = {
        'diskonlist': diskonlist,
        'diskonlisthistory': diskonlisthistory,
        'menu_items': menu_items,
    }
    return render(request, 'promotion/diskon/daftar_diskon.html', context)

@login_required
def tambah_diskon(request):
    data = request.POST
    id_diskon = data.get('ids_layanan')
    array_jenis = json.loads(id_diskon)

    diskon = data.get('diskon')
    tipe = data.get('tipe_diskon')
    min_qty = data.get('min_qty')
    is_active = data.get('is_active')
    created_by = request.user.first_name
    start_at = data.get('start_at')
    expired_at = data.get('expired_at')

    if tipe == "on":
        tipe_diskon = "%"
    else:
        tipe_diskon = "rp"

    if not PromotionDiskon.objects.exists():
        create = PromotionDiskon(
            kode=1,
            diskon=diskon,
            tipe_diskon=tipe_diskon,
            min_qty=min_qty,
            is_active=1,
            created_by=created_by,
            start_at=start_at,
            expired_at=expired_at,
            created_at=timezone.now()
        )
        create.save()
    else:
        last = PromotionDiskon.objects.last()
        newkode = int(last.kode) + 1
        create = PromotionDiskon(
            kode=newkode,
            diskon=diskon,
            tipe_diskon=tipe_diskon,
            min_qty=min_qty,
            is_active=1,
            created_by=created_by,
            start_at=start_at,
            expired_at=expired_at,
            created_at=timezone.now()
        )
        create.save()

    history_instances = []
    diskon_id = create.id
    for item in array_jenis:
        if item.startswith("O-"):
            jenis = "obat"
            value_jenis = item.split('-')[1]
        elif item.startswith("T-"):
            jenis = "tindakan"
            value_jenis = item.split('-')[1]
        elif item.startswith("TL-"):
            jenis = "tindakan"
            value_jenis = item.split('-')[1]

        history_instance = PromotionDiskonHistory(
            diskon_id=diskon_id,
            layanan_diskon_id=value_jenis,
            jenis_diskon=jenis,
            created_at=timezone.now()
        )
        history_instances.append(history_instance)

    PromotionDiskonHistory.objects.bulk_create(history_instances)

    result = {
        'status_code': 200,
        'status': 'Diskon berhasil ditambahkan.'
    }
    return JsonResponse(result, safe=False)

@login_required
def hapus_diskon(request, id):
    PromotionDiskonHistory.objects.filter(diskon_id=id).delete()
    PromotionDiskon.objects.get(id=id).delete()
    result = {
        'status_code': 200,
        'status': 'Diskon berhasil dihapus'
    }
    return JsonResponse(result, safe=False)

@login_required
def edit_layanan_diskon(request):
    try:
        inv_id = request.POST.get('inv_id')
        tipe_diskon = request.POST.get('tipe_diskon')
        diskon_pembelian = request.POST.get('diskon_pembelian')
        InvoiceLayanan.objects.filter(id=inv_id).update(diskon_pembelian=diskon_pembelian, tipe_diskon=tipe_diskon) 
        return JsonResponse('Berhasil', safe=False)   
    except:
        return JsonResponse('Gagal', safe=False)   
@login_required
def edit_obat_diskon(request):
    try:
        inv_id = request.POST.get('inv_id')
        tipe_diskon = request.POST.get('tipe_diskon')
        diskon_pembelian = request.POST.get('diskon_pembelian')
        InvoiceBarang.objects.filter(id=inv_id).update(diskon_pembelian=diskon_pembelian, tipe_diskon=tipe_diskon) 
        return JsonResponse('Berhasil', safe=False)   
    except:
        return JsonResponse('Gagal', safe=False)   

@login_required
def edit_lab_diskon(request):
    try:
        inv_id = request.POST.get('inv_id')
        tipe_diskon = request.POST.get('tipe_diskon')
        diskon_pembelian = request.POST.get('diskon_pembelian')
        InvoiceLab.objects.filter(id=inv_id).update(diskon_pembelian=diskon_pembelian, tipe_diskon=tipe_diskon) 
        return JsonResponse('Berhasil', safe=False)   
    except:
        return JsonResponse('Gagal', safe=False)  

@login_required
def check_layanan(request, id):
    get_barang = []
    get_layanan = []
    get_lab = []
    if PromotionDiskonHistory.objects.filter(diskon_id=id, jenis_diskon="obat").exists():
        get_ids = PromotionDiskonHistory.objects.filter(diskon_id=id, jenis_diskon="obat").values_list('layanan_diskon_id', flat=True)
        get_barang = Barang.objects.filter(id__in=Subquery(get_ids)).values()
    if PromotionDiskonHistory.objects.filter(diskon_id=id, jenis_diskon="tindakan").exists():
        get_ids = PromotionDiskonHistory.objects.filter(diskon_id=id, jenis_diskon="tindakan").values_list('layanan_diskon_id', flat=True)
        get_layanan = TarifLayanan.objects.filter(id__in=Subquery(get_ids)).values()
    if PromotionDiskonHistory.objects.filter(diskon_id=id, jenis_diskon="tindakan_lab").exists():
        get_ids = PromotionDiskonHistory.objects.filter(diskon_id=id, jenis_diskon="tindakan_lab").values_list('layanan_diskon_id', flat=True)
        get_lab = TarifLab.objects.filter(id__in=Subquery(get_ids)).values()

    return JsonResponse({'obat': list(get_barang), 'layanan': list(get_layanan), 'lab': list(get_lab)}, safe=False)