"""Pydantic schemas for partner models."""

from datetime import date, datetime
from typing import Optional
from uuid import UUID

from pydantic import BaseModel

from app.models.partner import DiscoverySessionStatus, OpportunityType, PartnerType


# Corporate Partner Schemas
class CorporatePartnerBase(BaseModel):
    company_name: str
    industry: Optional[str] = None
    company_size: Optional[str] = None
    website: Optional[str] = None
    contact_person: Optional[str] = None
    contact_email: Optional[str] = None
    contact_phone: Optional[str] = None
    partnership_start_date: Optional[datetime] = None


class CorporatePartnerCreate(CorporatePartnerBase):
    user_id: UUID


class CorporatePartnerResponse(CorporatePartnerBase):
    id: UUID
    user_id: UUID
    is_active: bool
    created_at: datetime
    updated_at: datetime

    class Config:
        from_attributes = True


class PartnerStatusUpdate(BaseModel):
    """Schema for admin to approve/reject a partner (syncs User.is_active)."""
    is_active: bool
    email_subject: Optional[str] = None
    email_body: Optional[str] = None
    login_base_url: Optional[str] = None  # Base URL for "Go to Dashboard" link (e.g. https://proconnect-edu.online)


# Partner Opportunity Schemas
class PartnerOpportunityBase(BaseModel):
    title: str
    description: str
    opportunity_type: OpportunityType
    department: Optional[str] = None
    requirements: Optional[str] = None
    location: Optional[str] = None
    salary_range: Optional[str] = None
    application_deadline: Optional[datetime] = None


class PartnerOpportunityCreate(PartnerOpportunityBase):
    pass


class PartnerOpportunityResponse(PartnerOpportunityBase):
    id: UUID
    partner_id: UUID
    is_active: bool
    created_at: datetime
    updated_at: datetime

    class Config:
        from_attributes = True


# Educational Partner Schemas
class EducationalPartnerBase(BaseModel):
    institution_name: str
    institution_type: Optional[str] = None
    country: Optional[str] = None
    website: Optional[str] = None
    contact_person: Optional[str] = None
    contact_email: Optional[str] = None
    contact_phone: Optional[str] = None
    partnership_start_date: Optional[datetime] = None
    revenue_share_percentage: Optional[float] = None


class EducationalPartnerCreate(EducationalPartnerBase):
    user_id: UUID


class EducationalPartnerResponse(EducationalPartnerBase):
    id: UUID
    user_id: UUID
    is_active: bool
    created_at: datetime
    updated_at: datetime

    class Config:
        from_attributes = True


# Partner Cohort Schema
class PartnerCohortResponse(BaseModel):
    id: UUID
    educational_partner_id: UUID
    programme_id: UUID
    academic_session_id: Optional[UUID] = None
    cohort_name: str
    start_date: datetime
    end_date: Optional[datetime] = None
    total_enrollments: int
    revenue_generated: float
    created_at: datetime
    updated_at: datetime

    class Config:
        from_attributes = True


# Discovery Session Schemas
class DiscoverySessionCreate(BaseModel):
    scheduled_date: datetime  # Full date and time
    scheduled_time: str  # e.g., "09:00 AM", "10:30 AM"
    notes: Optional[str] = None


class PublicDiscoveryBookRequest(BaseModel):
    """Public (unauthenticated) discovery session booking - partner identified by query params."""
    partner_type: str  # "edu" or "corporate"
    partner_id: UUID
    scheduled_date: date  # YYYY-MM-DD
    scheduled_time: str  # e.g., "09:00 AM"
    notes: Optional[str] = None


class DiscoverySessionResponse(BaseModel):
    id: UUID
    partner_type: PartnerType
    corporate_partner_id: Optional[UUID] = None
    educational_partner_id: Optional[UUID] = None
    user_id: UUID
    scheduled_date: datetime
    scheduled_time: str
    status: DiscoverySessionStatus
    google_calendar_event_id: Optional[str] = None
    google_calendar_link: Optional[str] = None
    notes: Optional[str] = None
    created_at: datetime
    updated_at: datetime

    class Config:
        from_attributes = True


class AvailableSlotsResponse(BaseModel):
    date: str  # YYYY-MM-DD
    available_slots: list[str]  # List of available time slots
    booked_slots: list[str]  # List of booked time slots
