from django.db import models
from django.utils import timezone


class BaseModel(models.Model):
    """
    全てのモデルで共通に使用するベースモデル
    """
    created_at = models.DateTimeField(auto_now_add=True, verbose_name='登録日時')
    updated_at = models.DateTimeField(auto_now=True, verbose_name='更新日時')
    is_deleted = models.BooleanField(default=False, verbose_name='削除フラグ')
    deleted_at = models.DateTimeField(null=True, blank=True, verbose_name='削除日時')
    is_published = models.BooleanField(default=True, verbose_name='公開フラグ')

    class Meta:
        abstract = True


class Event(BaseModel):
    """
    イベント情報テーブル
    """
    event_id = models.AutoField(primary_key=True, verbose_name='イベント情報ID')
    event_name = models.CharField(max_length=255, verbose_name='イベント名称')
    event_date = models.DateTimeField(verbose_name='イベント開催日')
    event_capacity = models.IntegerField(verbose_name='イベント定員')
    event_venue = models.CharField(max_length=255, verbose_name='イベント会場')
    event_venue_address = models.CharField(max_length=500, verbose_name='イベント会場住所')
    event_schedule = models.TextField(verbose_name='イベントのタイムスケジュール')
    event_description = models.TextField(verbose_name='イベント概要説明文')
    registration_start_date = models.DateTimeField(verbose_name='イベント申込み受付開始日')
    registration_end_date = models.DateTimeField(verbose_name='イベント申込み受付終了日')
    entrance_password = models.CharField(max_length=100, verbose_name='エントランスログインのパスワード')
    event_image = models.ImageField(upload_to='events/images/', verbose_name='イベント画像')
    seminar_description = models.TextField(null=True, blank=True, verbose_name='イベント内講習会の説明文')

    class Meta:
        verbose_name = 'イベント情報'
        verbose_name_plural = 'イベント情報'
        ordering = ['-event_date']

    def __str__(self):
        return self.event_name


class Seminar(BaseModel):
    """
    イベント内の講習会（セミナー）情報テーブル
    """
    seminar_id = models.AutoField(primary_key=True, verbose_name='講習会（セミナー）ID')
    event = models.ForeignKey(Event, on_delete=models.CASCADE, related_name='seminars', 
                             verbose_name='講習会（セミナー）が属するイベント')
    title = models.CharField(max_length=255, verbose_name='タイトル')
    description = models.TextField(verbose_name='セミナー内容説明文')
    speaker_company = models.CharField(max_length=255, verbose_name='セミナーの登壇企業名')
    speaker_name = models.CharField(max_length=100, verbose_name='セミナーの登壇者名')
    speaker_company_url = models.URLField(null=True, blank=True, verbose_name='セミナーの登壇企業のwebサイトURL')
    speaker_company_logo = models.ImageField(upload_to='seminars/logos/', 
                                            verbose_name='セミナーの登壇企業のロゴ画像')

    class Meta:
        verbose_name = '講習会（セミナー）'
        verbose_name_plural = '講習会（セミナー）'
        ordering = ['seminar_id']

    def __str__(self):
        return f"{self.title} ({self.speaker_company})"


class Organizer(BaseModel):
    """
    イベント主催企業情報テーブル
    """
    organizer_id = models.AutoField(primary_key=True, verbose_name='主催企業ID')
    organizer_name = models.CharField(max_length=255, verbose_name='主催企業名')
    organizer_abbreviation = models.CharField(max_length=100, verbose_name='主催企業名略称')
    organizer_website_url = models.URLField(verbose_name='主催企業のwebサイトURL')
    organizer_logo = models.ImageField(upload_to='organizers/logos/', verbose_name='主催企業のロゴ画像')
    event = models.ForeignKey(Event, on_delete=models.CASCADE, related_name='organizers', 
                             verbose_name='主催するイベント情報')

    class Meta:
        verbose_name = '主催企業'
        verbose_name_plural = '主催企業'
        ordering = ['organizer_id']

    def __str__(self):
        return self.organizer_name


class Sponsor(BaseModel):
    """
    スポンサー企業情報テーブル
    """
    SPONSOR_RANK_CHOICES = [
        ('platinum', 'プラチナ'),
        ('gold', 'ゴールド'),
        ('silver', 'シルバー'),
        ('bronze', 'ブロンズ'),
    ]

    sponsor_id = models.AutoField(primary_key=True, verbose_name='スポンサーID')
    event = models.ForeignKey(Event, on_delete=models.CASCADE, related_name='sponsors',
                             verbose_name='イベント')
    sponsor_name = models.CharField(max_length=255, verbose_name='スポンサー企業名')
    sponsor_logo = models.ImageField(upload_to='sponsors/logos/', verbose_name='スポンサーロゴ')
    sponsor_rank = models.CharField(max_length=20, choices=SPONSOR_RANK_CHOICES, 
                                   verbose_name='スポンサーランク')
    sponsor_website_url = models.URLField(null=True, blank=True, verbose_name='スポンサーwebサイトURL')

    class Meta:
        verbose_name = 'スポンサー'
        verbose_name_plural = 'スポンサー'
        ordering = ['sponsor_rank', 'sponsor_id']

    def __str__(self):
        return f"{self.sponsor_name} ({self.get_sponsor_rank_display()})"


class Member(BaseModel):
    """
    会員情報（イベント参加申込者）テーブル
    """
    OCCUPATION_CHOICES = [
        ('management', '経営層'),
        ('sales', '営業'),
        ('marketing', 'マーケティング'),
        ('engineer', 'エンジニア'),
        ('other', 'その他'),
    ]

    member_id = models.AutoField(primary_key=True, verbose_name='会員番号')
    event = models.ForeignKey(Event, on_delete=models.CASCADE, related_name='members',
                             verbose_name='参加申込したイベント')
    company_name = models.CharField(max_length=255, verbose_name='会社名')
    company_name_kana = models.CharField(max_length=255, null=True, blank=True, 
                                        verbose_name='会社名ふりがな')
    department = models.CharField(max_length=100, null=True, blank=True, verbose_name='部署名')
    position = models.CharField(max_length=100, null=True, blank=True, verbose_name='役職名')
    full_name = models.CharField(max_length=100, verbose_name='氏名')
    email = models.EmailField(verbose_name='メールアドレス')
    phone_number = models.CharField(max_length=20, null=True, blank=True, verbose_name='電話番号')
    occupation = models.CharField(max_length=50, choices=OCCUPATION_CHOICES, null=True, 
                                 blank=True, verbose_name='職種')
    questionnaire_response = models.TextField(null=True, blank=True, verbose_name='アンケートへの回答')
    free_comment = models.TextField(null=True, blank=True, verbose_name='自由記入欄')
    privacy_policy_agreed = models.BooleanField(default=False, verbose_name='プライバシーポリシーへの同意')
    is_cancelled = models.BooleanField(default=False, verbose_name='参加キャンセル済みフラグ')
    cancelled_at = models.DateTimeField(null=True, blank=True, verbose_name='参加キャンセル日時')

    class Meta:
        verbose_name = '会員'
        verbose_name_plural = '会員'
        ordering = ['-created_at']

    def __str__(self):
        return f"{self.full_name} ({self.company_name})"


class News(BaseModel):
    """
    お知らせ情報テーブル
    """
    NEWS_TYPE_CHOICES = [
        ('important', '重要'),
        ('update', 'アップデート'),
        ('information', 'お知らせ'),
    ]

    news_id = models.AutoField(primary_key=True, verbose_name='お知らせ情報ID')
    event = models.ForeignKey(Event, on_delete=models.CASCADE, related_name='news_items',
                             verbose_name='イベント')
    news_date = models.DateField(verbose_name='日付')
    news_type = models.CharField(max_length=50, choices=NEWS_TYPE_CHOICES, 
                                verbose_name='ニュースの種類')
    title = models.CharField(max_length=255, verbose_name='タイトル')
    description = models.TextField(verbose_name='説明')

    class Meta:
        verbose_name = 'お知らせ'
        verbose_name_plural = 'お知らせ'
        ordering = ['-news_date']

    def __str__(self):
        return self.title


class PastEventImage(BaseModel):
    """
    過去のイベント画像テーブル
    """
    image_id = models.AutoField(primary_key=True, verbose_name='画像ID')
    event = models.ForeignKey(Event, on_delete=models.CASCADE, related_name='past_images',
                             verbose_name='イベント')
    image = models.ImageField(upload_to='events/past_images/', verbose_name='画像')
    caption = models.CharField(max_length=255, null=True, blank=True, verbose_name='キャプション')
    display_order = models.IntegerField(default=0, verbose_name='表示順序')

    class Meta:
        verbose_name = '過去のイベント画像'
        verbose_name_plural = '過去のイベント画像'
        ordering = ['display_order']

    def __str__(self):
        return f"Image {self.image_id}"
