"""
System endpoints
"""
from fastapi import APIRouter, Depends, HTTPException, status
from sqlalchemy.orm import Session
from typing import List
from uuid import UUID

from app.db.session import get_db
from app.models.system import EmailTemplate, EmailLog, SystemSetting
from app.models.user import Language
from app.schemas.system import (
    EmailTemplateCreate, EmailTemplateUpdate, EmailTemplate,
    EmailLogCreate, EmailLogUpdate, EmailLog,
    SystemSettingCreate, SystemSettingUpdate, SystemSetting
)

router = APIRouter()


# Email Template endpoints
@router.post("/email-templates/", response_model=EmailTemplate)
def create_email_template(
    template: EmailTemplateCreate,
    db: Session = Depends(get_db)
):
    # Verify language exists
    if template.language_id:
        db_language = db.query(Language).filter(Language.language_id == template.language_id).first()
        if db_language is None:
            raise HTTPException(status_code=404, detail="Language not found")
    
    db_template = EmailTemplate(**template.dict())
    db.add(db_template)
    db.commit()
    db.refresh(db_template)
    return db_template


@router.get("/email-templates/", response_model=List[EmailTemplate])
def read_email_templates(
    skip: int = 0,
    limit: int = 100,
    db: Session = Depends(get_db)
):
    templates = db.query(EmailTemplate).offset(skip).limit(limit).all()
    return templates


@router.get("/email-templates/{template_id}", response_model=EmailTemplate)
def read_email_template(
    template_id: UUID,
    db: Session = Depends(get_db)
):
    db_template = db.query(EmailTemplate).filter(EmailTemplate.template_id == template_id).first()
    if db_template is None:
        raise HTTPException(status_code=404, detail="Email template not found")
    return db_template


@router.put("/email-templates/{template_id}", response_model=EmailTemplate)
def update_email_template(
    template_id: UUID,
    template: EmailTemplateUpdate,
    db: Session = Depends(get_db)
):
    db_template = db.query(EmailTemplate).filter(EmailTemplate.template_id == template_id).first()
    if db_template is None:
        raise HTTPException(status_code=404, detail="Email template not found")
    
    update_data = template.dict(exclude_unset=True)
    for key, value in update_data.items():
        setattr(db_template, key, value)
    
    db.commit()
    db.refresh(db_template)
    return db_template


@router.delete("/email-templates/{template_id}")
def delete_email_template(
    template_id: UUID,
    db: Session = Depends(get_db)
):
    db_template = db.query(EmailTemplate).filter(EmailTemplate.template_id == template_id).first()
    if db_template is None:
        raise HTTPException(status_code=404, detail="Email template not found")
    
    db.delete(db_template)
    db.commit()
    return {"message": "Email template deleted successfully"}


# Email Log endpoints
@router.post("/email-logs/", response_model=EmailLog)
def create_email_log(
    log: EmailLogCreate,
    db: Session = Depends(get_db)
):
    # Verify template exists
    if log.template_id:
        db_template = db.query(EmailTemplate).filter(EmailTemplate.template_id == log.template_id).first()
        if db_template is None:
            raise HTTPException(status_code=404, detail="Email template not found")
    
    db_log = EmailLog(**log.dict())
    db.add(db_log)
    db.commit()
    db.refresh(db_log)
    return db_log


@router.get("/email-logs/", response_model=List[EmailLog])
def read_email_logs(
    skip: int = 0,
    limit: int = 100,
    db: Session = Depends(get_db)
):
    logs = db.query(EmailLog).offset(skip).limit(limit).all()
    return logs


@router.get("/email-logs/{log_id}", response_model=EmailLog)
def read_email_log(
    log_id: UUID,
    db: Session = Depends(get_db)
):
    db_log = db.query(EmailLog).filter(EmailLog.log_id == log_id).first()
    if db_log is None:
        raise HTTPException(status_code=404, detail="Email log not found")
    return db_log


@router.put("/email-logs/{log_id}", response_model=EmailLog)
def update_email_log(
    log_id: UUID,
    log: EmailLogUpdate,
    db: Session = Depends(get_db)
):
    db_log = db.query(EmailLog).filter(EmailLog.log_id == log_id).first()
    if db_log is None:
        raise HTTPException(status_code=404, detail="Email log not found")
    
    update_data = log.dict(exclude_unset=True)
    for key, value in update_data.items():
        setattr(db_log, key, value)
    
    db.commit()
    db.refresh(db_log)
    return db_log


@router.delete("/email-logs/{log_id}")
def delete_email_log(
    log_id: UUID,
    db: Session = Depends(get_db)
):
    db_log = db.query(EmailLog).filter(EmailLog.log_id == log_id).first()
    if db_log is None:
        raise HTTPException(status_code=404, detail="Email log not found")
    
    db.delete(db_log)
    db.commit()
    return {"message": "Email log deleted successfully"}


# System Setting endpoints
@router.post("/settings/", response_model=SystemSetting)
def create_system_setting(
    setting: SystemSettingCreate,
    db: Session = Depends(get_db)
):
    # Check if setting key already exists
    existing_setting = db.query(SystemSetting).filter(SystemSetting.setting_key == setting.setting_key).first()
    if existing_setting:
        raise HTTPException(
            status_code=status.HTTP_400_BAD_REQUEST,
            detail="Setting key already exists"
        )
    
    db_setting = SystemSetting(**setting.dict())
    db.add(db_setting)
    db.commit()
    db.refresh(db_setting)
    return db_setting


@router.get("/settings/", response_model=List[SystemSetting])
def read_system_settings(
    skip: int = 0,
    limit: int = 100,
    db: Session = Depends(get_db)
):
    settings = db.query(SystemSetting).offset(skip).limit(limit).all()
    return settings


@router.get("/settings/{setting_id}", response_model=SystemSetting)
def read_system_setting(
    setting_id: UUID,
    db: Session = Depends(get_db)
):
    db_setting = db.query(SystemSetting).filter(SystemSetting.setting_id == setting_id).first()
    if db_setting is None:
        raise HTTPException(status_code=404, detail="System setting not found")
    return db_setting


@router.get("/settings/key/{setting_key}", response_model=SystemSetting)
def read_system_setting_by_key(
    setting_key: str,
    db: Session = Depends(get_db)
):
    db_setting = db.query(SystemSetting).filter(SystemSetting.setting_key == setting_key).first()
    if db_setting is None:
        raise HTTPException(status_code=404, detail="System setting not found")
    return db_setting


@router.put("/settings/{setting_id}", response_model=SystemSetting)
def update_system_setting(
    setting_id: UUID,
    setting: SystemSettingUpdate,
    db: Session = Depends(get_db)
):
    db_setting = db.query(SystemSetting).filter(SystemSetting.setting_id == setting_id).first()
    if db_setting is None:
        raise HTTPException(status_code=404, detail="System setting not found")
    
    # Check if setting key already exists (and it's not this setting)
    if setting.setting_key and setting.setting_key != db_setting.setting_key:
        existing_setting = db.query(SystemSetting).filter(SystemSetting.setting_key == setting.setting_key).first()
        if existing_setting:
            raise HTTPException(
                status_code=status.HTTP_400_BAD_REQUEST,
                detail="Setting key already exists"
            )
    
    update_data = setting.dict(exclude_unset=True)
    for key, value in update_data.items():
        setattr(db_setting, key, value)
    
    db.commit()
    db.refresh(db_setting)
    return db_setting


@router.delete("/settings/{setting_id}")
def delete_system_setting(
    setting_id: UUID,
    db: Session = Depends(get_db)
):
    db_setting = db.query(SystemSetting).filter(SystemSetting.setting_id == setting_id).first()
    if db_setting is None:
        raise HTTPException(status_code=404, detail="System setting not found")
    
    db.delete(db_setting)
    db.commit()
    return {"message": "System setting deleted successfully"}