from django import forms
from django.forms import ModelForm, ValidationError
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.forms import PasswordResetForm as DjangoPasswordResetForm
from django.contrib.auth.forms import SetPasswordForm as DjangoSetPasswordForm
from django.contrib.auth.forms import PasswordChangeForm as DjangoPasswordChangeForm
from datetime import datetime, timedelta, time

from .models import *

class DateLocal(forms.DateTimeInput):
    input_type = 'datetime-local'

class DateOnly(forms.DateTimeInput):
    input_type = 'date' 

class RegisterForm(UserCreationForm):
    password1 = forms.CharField(
        widget=forms.PasswordInput(attrs={'class': 'form-control'}),
        label='Password'
    )

    password2 = forms.CharField(
        widget=forms.PasswordInput(attrs={'class': 'form-control'}),
        label='Confirm Password'
    )

    # Define your custom choices for the 'role' field
    CUSTOM_ROLE_CHOICES = [
        ('Organisation', 'Organisation'),
        ('Individual', 'Individual'),
    ]

    role = forms.ChoiceField(
        choices=CUSTOM_ROLE_CHOICES,
        widget=forms.Select(attrs={'class': 'form-control'}),
        label='Register as an'
    )

    class Meta:
        model = CustomUser
        fields = ['name', 'email', 'role', 'password1', 'password2']
        widgets = {
            'name': forms.TextInput(attrs={'class': 'form-control'}),
            'email': forms.EmailInput(attrs={'class': 'form-control'}),
        }


class AdminForm(UserCreationForm):
    password1 = forms.CharField(
        widget=forms.PasswordInput(attrs={'class': 'form-control'}),
        label='Password'
    )

    password2 = forms.CharField(
        widget=forms.PasswordInput(attrs={'class': 'form-control'}),
        label='Confirm Password'
    )

    # Define your custom choices for the 'role' field
    CUSTOM_ROLE_CHOICES = [
        ('Event Manager', 'Event Manager'),
        ('COP Desk Officer', 'COP Desk Officer'),
        ('Finance', 'Finance'),
        ('Admin', 'Admin'),
        ('Bilaterals', 'Bilaterals')
    ]

    role = forms.ChoiceField(
        choices=CUSTOM_ROLE_CHOICES,
        widget=forms.Select(attrs={'class': 'form-control'}),
        label='Register as an'
    )

    class Meta:
        model = CustomUser
        fields = ['name', 'email', 'role', 'password1', 'password2']
        widgets = {
            'name': forms.TextInput(attrs={'class': 'form-control'}),
            'email': forms.EmailInput(attrs={'class': 'form-control'}),
        }

class AdminUpdateForm(ModelForm):
    # Define your custom choices for the 'role' field
    CUSTOM_ROLE_CHOICES = [
        ('Event Manager', 'Event Manager'),
        ('COP Desk Officer', 'COP Desk Officer'),
        ('Finance', 'Finance'),
        ('Admin', 'Admin'),
        ('Individual', 'Individual'),
         ('Bilaterals', 'Bilaterals'),
    ]

    role = forms.ChoiceField(
        choices=CUSTOM_ROLE_CHOICES,
        widget=forms.Select(attrs={'class': 'form-control'}),
        label='Update as'
    )

    class Meta:
        model = CustomUser
        fields = ['role']


class CustomPasswordResetForm(DjangoPasswordResetForm):
    email = forms.EmailField(
        widget=forms.EmailInput(
            attrs={'class': 'form-control', 'placeholder': 'Enter your email'}
        )
    )

class CustomSetPasswordForm(DjangoSetPasswordForm):
    new_password1 = forms.CharField(
        widget=forms.PasswordInput(
            attrs={'class': 'form-control', 'placeholder': 'New password'}
        ),
        label='New Password'
    )
    new_password2 = forms.CharField(
        widget=forms.PasswordInput(
            attrs={'class': 'form-control', 'placeholder': 'Confirm new password'}
        ),
        label='Confirm Password'
    )

class CustomPasswordChangeForm(DjangoPasswordChangeForm):
    old_password = forms.CharField(
        widget=forms.PasswordInput(
            attrs={'class': 'form-control', 'placeholder': 'Old password'}
        ),
        label='Old Password'
    )
    new_password1 = forms.CharField(
        widget=forms.PasswordInput(
            attrs={'class': 'form-control', 'placeholder': 'New password'}
        ),
        label='New Password'
    )
    new_password2 = forms.CharField(
        widget=forms.PasswordInput(
            attrs={'class': 'form-control', 'placeholder': 'Confirm new password'}
        ),
        label='Confirm Password'
    )

class OrganisationForm(ModelForm):
    class Meta:
        model = Organisation
        fields = ['logo', 'organisation_type', 'contact_number', 'address_line',
                  'state', 'focus_area', 'description', 'twitter', 'facebook', 'instagram', 'website',
                  'certificate']
        widgets = {
            'logo': forms.ClearableFileInput(attrs={'class':'form-control'}),
            'organisation_type': forms.Select(attrs={'class': 'form-control'}),
            'contact_number': forms.NumberInput(attrs={'class': 'form-control'}),
            'address_line': forms.TextInput(attrs={'class': 'form-control'}),
            'state': forms.Select(attrs={'class': 'form-control'}),
            'focus_area': forms.Select(attrs={'class': 'form-control'}),
            'description': forms.Textarea(attrs={'class': 'form-control'}),
            'website': forms.URLInput(attrs={'class': 'form-control'}),
            'instagram': forms.URLInput(attrs={'class': 'form-control'}),
            'facebook': forms.URLInput(attrs={'class': 'form-control'}),
            'twitter': forms.URLInput(attrs={'class': 'form-control'}),
            'certificate': forms.ClearableFileInput(attrs={'class':'form-control'}), 
        }
        labels = {
            'certificate': 'Your CAC Certificate or Letter of Request for (GOs/MDAs)'
        }

class StatusForm(ModelForm):
    class Meta:
        model = Organisation
        fields = ['status']
        widgets = {
            'status': forms.Select(attrs={'class': 'form-control'}),
        }

class NominationForm(ModelForm):
    class Meta:
        model = Nominations
        fields = ['photograph', 'name', 'dob', 'email', 'position', 'passport']
        widgets = {
            'photograph': forms.ClearableFileInput(attrs={'class':'form-control'}),
            'name': forms.TextInput(attrs={'class': 'form-control'}  ),
            'dob': DateOnly(attrs={'class': 'form-control'}),
            'email': forms.EmailInput(attrs={'class': 'form-control'}),
            'position': forms.TextInput(attrs={'class': 'form-control'}),
            'passport': forms.ClearableFileInput(attrs={'class':'form-control'}),
        }

        labels = {
            'photograph': 'Upload Passport Photograph',
            'name': 'Full Name',
            'dob': 'Date of Birth',
            'email': 'E-Mail Address',
            'position': 'Office Held / Position',
            'pasport': 'International Passport Data Page',
        }

class NominationApproval(ModelForm):
    # Define your custom choices for the 'role' field
    CUSTOM_ROLE_CHOICES = [
        ('Party', 'Party'),
        ('Party Overflow', 'Party Overflow'),
    ]

    accreditation_type = forms.ChoiceField(
        choices=CUSTOM_ROLE_CHOICES,
        widget=forms.Select(attrs={'class': 'form-control'}),
    )

    class Meta:
        model = Nominations
        fields = ['accreditation_type', 'accreditation_number', 'status']
        widgets = {
            #'accreditation_type': forms.Select(attrs={'class': 'form-control'}),
            'accreditation_number': forms.TextInput(attrs={'class': 'form-control'}),
            'status': forms.Select(attrs={'class': 'form-control'}),
        }

EVENT_DAYS = [
    ('2026-11-09', 'November 9 - Day 1'),
    ('2026-11-10', 'November 10 - Day 2'),
    ('2026-11-11', 'November 11 - Day 3'),
    ('2026-11-12', 'November 12 - Day 4'),
    ('2026-11-13', 'November 13 - Day 5'),
    ('2026-11-14', 'November 14 - Day 6'),
    ('2026-11-15', 'November 15 - Rest Day'),
    ('2026-11-16', 'November 16 - Day 8'),
    ('2026-11-17', 'November 17 - Day 9'),
    ('2026-11-18', 'November 18 - Day 10'),
    ('2026-11-19', 'November 19 - Day 11'),
    ('2026-11-20', 'November 20 - Day 12')
]

def generate_time_slots(start_time, end_time, display_interval, actual_interval):
    time_slots = []
    current_time = start_time
    while current_time < end_time:
        display_end_interval = (datetime.combine(datetime.today(), current_time) + display_interval).time()
        actual_end_interval = (datetime.combine(datetime.today(), current_time) + actual_interval).time()
        time_slots.append((current_time.strftime("%H:%M:%S"), f"{current_time.strftime('%I:%M %p')} - {display_end_interval.strftime('%I:%M %p')}"))
        current_time = actual_end_interval
    return time_slots

TIME_SLOTS = generate_time_slots(time(9, 0), time(18, 0), timedelta(minutes=45), timedelta(hours=1))

class EventForm(ModelForm):
    day = forms.ChoiceField(
        choices=EVENT_DAYS,
        label="Event Day",
        widget=forms.Select(attrs={'class': 'form-control', 'id': 'id_day'})
    )
    time = forms.ChoiceField(
        label="Event Time",
        widget=forms.Select(attrs={'class': 'form-control', 'id': 'id_time'})
    )

    class Meta:
        model = COPEventApplication
        fields = ['org', 'proposed_title', 'event_type', 'number_of_speakers', 'day', 'time', 'status', 'description', 'flier']

        widgets = {
            'org': forms.TextInput(attrs={'class': 'form-control'}),
            'proposed_title': forms.TextInput(attrs={'class': 'form-control'}),
            'number_of_speakers': forms.NumberInput(attrs={'class': 'form-control'}),
            'event_type': forms.Select(attrs={'class': 'form-control'}),
            'status': forms.Select(attrs={'class': 'form-control'}),
            'description': forms.Textarea(attrs={'class': 'form-control'}),
            'flier': forms.ClearableFileInput(attrs={'class': 'form-control'}),
        }

        labels = {
            'org': 'Organisation',
        }

    def __init__(self, *args, **kwargs):
        super(EventForm, self).__init__(*args, **kwargs)
        self.fields['time'].choices = TIME_SLOTS

    def get_filtered_time_slots(self, selected_day):
        selected_events = COPEventApplication.objects.filter(day=selected_day)
        selected_times = [event.time.strftime("%H:%M:%S") for event in selected_events]
        available_time_slots = [(time, label) for time, label in TIME_SLOTS if time not in selected_times]
        return available_time_slots

    def clean_day(self):
        day = self.cleaned_data.get('day')
        return datetime.strptime(day, '%Y-%m-%d').date()

    def clean_time(self):
        time_str = self.cleaned_data.get('time')
        return datetime.strptime(time_str, '%H:%M:%S').time()

    
class ReportForm(ModelForm):
    class Meta:
        model = PostEventReport
        fields = ['description', 'image_url', 'video_url']
        widgets = {
            'image_url': forms.URLInput(attrs={'class': 'form-control'}),
            'video_url': forms.URLInput(attrs={'class': 'form-control'}),
            'description':forms.Textarea(attrs={'class':'form-control'}),
            #'flier': forms.ClearableFileInput(attrs={'class':'form-control'}),
        }

class AnnouncementForm(ModelForm):
    class Meta:
        model = COPEventAnnouncement
        fields = ['subject', 'message', 'sender']
        widgets = {
            'subject': forms.TextInput(attrs={'class': 'form-control'}),
            'sender': forms.TextInput(attrs={'class': 'form-control'}),
            'message':forms.Textarea(attrs={'class':'form-control'}),
            #'flier': forms.ClearableFileInput(attrs={'class':'form-control'}),
        }

class OrgEventForm(ModelForm):
    day = forms.ChoiceField(
        choices=EVENT_DAYS,
        label="Event Day",
        widget=forms.Select(attrs={'class': 'form-control', 'id': 'id_day'})
    )
    time = forms.ChoiceField(
        label="Event Time",
        widget=forms.Select(attrs={'class': 'form-control', 'id': 'id_time'})
    )

    class Meta:
        model = COPEventApplication
        fields = ['proposed_title', 'event_type', 'number_of_speakers', 'day', 'time', 'description', 'flier']
        widgets = {
            'proposed_title': forms.TextInput(attrs={'class': 'form-control'}),
            'number_of_speakers': forms.NumberInput(attrs={'class': 'form-control'}),
            'event_type': forms.Select(attrs={'class': 'form-control'}),
            'description':forms.Textarea(attrs={'class':'form-control'}),
            'flier': forms.ClearableFileInput(attrs={'class':'form-control'}),
        }

        labels = {
            'org' : 'Organisation',
        }
    
    def __init__(self, *args, **kwargs):
        super(OrgEventForm, self).__init__(*args, **kwargs)
        self.fields['time'].choices = TIME_SLOTS

    def get_filtered_time_slots(self, selected_day):
        selected_events = COPEventApplication.objects.filter(day=selected_day)
        selected_times = [event.time.strftime("%H:%M:%S") for event in selected_events]
        available_time_slots = [(time, label) for time, label in TIME_SLOTS if time not in selected_times]
        return available_time_slots

    def clean_day(self):
        day = self.cleaned_data.get('day')
        return datetime.strptime(day, '%Y-%m-%d').date()

    def clean_time(self):
        time_str = self.cleaned_data.get('time')
        return datetime.strptime(time_str, '%H:%M:%S').time()
    
class InvoiceForm(ModelForm):
    class Meta:
        model = Invoice
        fields = ['currency', 'amount_due',]
        widgets = {
            'amount_due': forms.NumberInput(attrs={'class': 'form-control'}),
            'currency': forms.Select(attrs={'class': 'form-control'}),
        }

        labels = {
                    'amount_due' : 'Price of the Event',
                    'currency' : 'Type of Currency',
                }

class PaidForm(ModelForm):
    class Meta:
        model = Invoice
        fields = ['amount_paid', 'date_paid', 'proof']
        widgets = {
            'amount_paid': forms.NumberInput(attrs={'class': 'form-control'}),
            'date_paid': DateLocal(attrs={'class': 'form-control'}),
            'proof': forms.ClearableFileInput(attrs={'class':'form-control'}),
        }

        labels = {
            'proof' : 'Upload a Scanned Proof of Payment. Only PGN/JPG',
        }

class ComfirmForm(ModelForm):
    class Meta:
        model = Invoice
        fields = ['payment_status']
        widgets = {
            'payment_status': forms.Select(attrs={'class': 'form-control'}),
        }

        labels = {
            'payment_status' : 'Confirm Payment',
        }

class AddOrgForm(UserCreationForm):
    password1 = forms.CharField(
        widget=forms.HiddenInput(),
    )

    password2 = forms.CharField(
        widget=forms.HiddenInput(),   
    )

    class Meta:
        model = CustomUser
        fields = ['name', 'email']
        widgets = {
            'name': forms.TextInput(attrs={'class': 'form-control'}),
            'email': forms.EmailInput(attrs={'class': 'form-control'}),
        }

class MeetingForm(ModelForm):
    class Meta:
        model = Bilateral
        fields = ['title', 'hosts', 'objectives', 'date', 'point', 'person', 'phone', 'email']
        widgets = {
            'title': forms.TextInput(attrs={'class': 'form-control'}),
            'hosts': forms.TextInput(attrs={'class': 'form-control'}),
            'objectives':forms.Textarea(attrs={'class':'form-control'}),
            'date': DateLocal(attrs={'class': 'form-control'}),
            'point':forms.Textarea(attrs={'class':'form-control'}),
            'person': forms.TextInput(attrs={'class': 'form-control'}),
            'phone': forms.TextInput(attrs={'class': 'form-control'}),
            'email': forms.EmailInput(attrs={'class': 'form-control'}),
        }

        labels = {
            'title' : 'Title of the Meeting',
            'hosts': 'Who is hosting the Meeting',
            'objectives': 'Meeting Objectives',
            'date': 'Date & Time of Meeting',
            'point': 'Meeting Point (Location)',
            'person': 'Meeting Contact Person',
            'Phone': 'Contact Person Phone Number',
            'email': 'Contact Person E-mail Address',
        }

class ReportMeetingForm(ModelForm):
    class Meta:
        model = BilateralReport
        fields = ['outcomes', 'actions', 'image_url', 'video_url']
        widgets = {
            'outcomes':forms.Textarea(attrs={'class':'form-control'}),
            'actions':forms.Textarea(attrs={'class':'form-control'}),
            'image_url': forms.URLInput(attrs={'class': 'form-control'}),
            'video_url': forms.URLInput(attrs={'class': 'form-control'}),
        }

        labels = {
            'outcomes' : 'Summary of the Meeting Outcomes',
            'actions': 'Action Points',
            'image_url': 'Add a Link to Images of the Meeting (Optional)',
            'video_url': 'Add a Link to Youtube Video of the Meeting (Optional)',
        }

class ResourcesForm(ModelForm):
    class Meta:
        model = EventResources
        fields = ['youtube_live', 'slide1', 'slide2', 'slide3', 'slide4', 'slide5', 'slide6', 'slide7', 'slide8', 'slide9', 'slide10', 'slide11', 'slide12',]
        widgets = {
            'youtube_live': forms.URLInput(attrs={'class': 'form-control'}),
            'slide1': forms.ClearableFileInput(attrs={'class':'form-control'}),
            'slide2': forms.ClearableFileInput(attrs={'class':'form-control'}),
            'slide3': forms.ClearableFileInput(attrs={'class':'form-control'}),
            'slide4': forms.ClearableFileInput(attrs={'class':'form-control'}),
            'slide5': forms.ClearableFileInput(attrs={'class':'form-control'}),
            'slide6': forms.ClearableFileInput(attrs={'class':'form-control'}),
            'slide7': forms.ClearableFileInput(attrs={'class':'form-control'}),
            'slide8': forms.ClearableFileInput(attrs={'class':'form-control'}),
            'slide9': forms.ClearableFileInput(attrs={'class':'form-control'}),
            'slide10': forms.ClearableFileInput(attrs={'class':'form-control'}),
            'slide11': forms.ClearableFileInput(attrs={'class':'form-control'}),
            'slide12': forms.ClearableFileInput(attrs={'class':'form-control'}),
        }

        labels = {
            'youtube_live' : 'Add a link to your live veideo (Optional)',
            'slide1': 'Upload any event resources in document format (Slides/PDF/Docs) - Optional',
            'slide2': 'Upload any event resources in document format (Slides/PDF/Docs) - Optional',
            'slide3': 'Upload any event resources in document format (Slides/PDF/Docs) - Optional',
            'slide4': 'Upload any event resources in document format (Slides/PDF/Docs) - Optional',
            'slide5': 'Upload any event resources in document format (Slides/PDF/Docs) - Optional',
            'slide6': 'Upload any event resources in document format (Slides/PDF/Docs) - Optional',
            'slide7': 'Upload any event resources in document format (Slides/PDF/Docs) - Optional',
            'slide8': 'Upload any event resources in document format (Slides/PDF/Docs) - Optional',
            'slide9': 'Upload any event resources in document format (Slides/PDF/Docs) - Optional',
            'slide10': 'Upload any event resources in document format (Slides/PDF/Docs) - Optional',
            'slide11': 'Upload any event resources in document format (Slides/PDF/Docs) - Optional',
            'slide12': 'Upload any event resources in document format (Slides/PDF/Docs) - Optional',
        }

class AttendaneForm(forms.ModelForm):
    class Meta:
        model = Attendane
        fields = [
            'name',
            'phone',
            'email',
            'country',
            'badge_type',
            'negotiation_track',
        ]
        widgets = {
            'name': forms.TextInput(attrs={
                'class': 'form-control',
                'placeholder': 'Enter full name',
            }),
            'phone': forms.NumberInput(attrs={
                'class': 'form-control',
                'placeholder': 'Enter phone number',
            }),
            'email': forms.EmailInput(attrs={
                'class': 'form-control',
                'placeholder': 'Enter email address',
            }),
            'country': forms.Select(attrs={
                'class': 'form-select',
            }),
            'badge_type': forms.Select(attrs={
                'class': 'form-select',
            }),
            'negotiation_track': forms.Select(attrs={
                'class': 'form-select',
            }),
        }
        labels = {
            'name': 'Full Name',
            'phone': 'Phone Number',
            'email': 'Email Address',
            'country': 'Country',
            'badge_type': 'Badge Type',
            'negotiation_track': 'Negotiation Track',
        }
