
from datetime import datetime
import pandas as pd
import os
from django.conf import settings
from .serializers import *
from .models import *
from customers.models import Customer 
import threading

def update_customer_list(organisation_id,customer_id):
    customer = Customer.objects.get(pk=customer_id)
    if customer:
        customer_data = CustomerSearchSerializer(
            customer
        ).data 

        csv_file_name  = f'{settings.STATIC_ROOT}/reports/{organisation_id}/customers/customers-list.csv'
        if os.path.exists(csv_file_name):
            customers_list    = pd.read_csv(csv_file_name)
            customers_list    = customers_list.fillna('')
            condition_to_delete = customers_list['id'] == customer_id
            customers_list = customers_list[~condition_to_delete].reset_index(drop=True)
            customers_list.loc[len(customers_list)] = customer_data
            customers_list.to_csv(csv_file_name, index=False)

def update_customer_thread(organisation_id,customer_id):
    thread_object = threading.Thread(target=update_customer_list, args=(organisation_id,customer_id,))
    thread_object.start()

def generate_customer_reg_list(organisation_id):
    customers = Customer.objects.filter(customer_branch__branch_organisation_id=organisation_id)
    customer_data = CustomerSearchSerializer(
        customers,
        many=True
    ).data 

    # Convert to DataFrame
    df = pd.DataFrame(customer_data)
    #df['customer']         = df['customer'].to_json()
    #df['customer_address'] = df['customer_address'].to_json()
    # Write to CSV file
    organisation_directory = settings.STATIC_ROOT + f'/reports/{organisation_id}/customers'
    os.makedirs(organisation_directory, exist_ok=True)

    csv_file_name = f'{organisation_directory}/customers-list.csv'
    df.to_csv(csv_file_name, index=False)
    df = pd.DataFrame()
    
def retrieve_customers(query_filters):
    customers_list  = []
    count           = 0
    start_date      = query_filters['start_date']
    end_date        = query_filters['end_date']
    branch_ids      = query_filters['branch_ids']
    has_members     = query_filters['has_members']
    is_deleted      = query_filters['is_deleted']
    page            = query_filters['page']
    page_size       = query_filters['page_size']
    search          = query_filters['search']
    ordering        = query_filters['ordering']
    organisation_id = query_filters['organisation_id']
    source_customer_type_id = query_filters['source_customer_type_id']

    start_index = (int(page) - 1) * int(page_size)
    end_index = int(page) * int(page_size)

    csv_file_name  = f'{settings.STATIC_ROOT}/reports/{organisation_id}/customers/customers-list.csv'
    
    if not os.path.exists(csv_file_name):
        generate_customer_reg_list(organisation_id)
     
    if os.path.exists(csv_file_name):
        customers_list    = pd.read_csv(csv_file_name)
        customers_list    = customers_list.fillna('')
        # Filter between dates
        customers_list['date_added'] = pd.to_datetime(customers_list['date_added'])
        customers_list['date_added'] = customers_list['date_added'].dt.strftime('%Y-%m-%d')

        filter_conditions = customers_list['customer_branch_id'].isin(branch_ids)
        if start_date:
            start_date = query_filters['start_date'].strftime('%Y-%m-%d')
            filter_conditions = filter_conditions & (customers_list['date_added'] >= start_date)

        if end_date:
            end_date = query_filters['end_date'].strftime('%Y-%m-%d')
            filter_conditions = filter_conditions & (customers_list['date_added'] <= end_date)

        # Search Filter
        if search:
            filter_conditions = (customers_list['name'].str.contains(search, case=False) | customers_list['member_number'].str.contains(search, case=False) | customers_list['old_member_number'].str.contains(search, case=False))
        customers_list = customers_list[filter_conditions]
        
        if is_deleted is not None:
            customers_list = customers_list[customers_list['is_deleted'] == is_deleted]
        
        if has_members is not None:
            customers_list = customers_list[customers_list['has_members'] == has_members]

        if source_customer_type_id:
            customers_list['source_customer_type_id'] = source_customer_type_id
        
        if ordering:
            customers_list = customers_list.sort_values(by=ordering, ascending=True)
        else:
            customers_list = customers_list.sort_values(by='name',ascending=True)
        #customers_list['customer']         = customers_list['customer'].apply(json.loads)
        #customers_list['customer_address'] = customers_list['customer_address'].apply(json.loads)
        count          = len(customers_list)
        customers_list = customers_list.iloc[start_index:end_index]
        results        = customers_list.to_dict(orient='records')

        customers_list = pd.DataFrame()
        return {"count":count,"results":results}
    return {"count":count,"results":[]}

