from typing import Optional
from fastapi import APIRouter, Body, Depends, HTTPException
from pydantic import BaseModel

from selfprivacy_api.dependencies import get_token_header

import selfprivacy_api.actions.system as system_actions

router = APIRouter(
    prefix="/system",
    tags=["system"],
    dependencies=[Depends(get_token_header)],
    responses={404: {"description": "Not found"}},
)


@router.get("/configuration/timezone")
async def get_timezone():
    """Get the timezone of the server"""
    return system_actions.get_timezone()


class ChangeTimezoneRequestBody(BaseModel):
    """Change the timezone of the server"""

    timezone: str


@router.put("/configuration/timezone")
async def change_timezone(timezone: ChangeTimezoneRequestBody):
    """Change the timezone of the server"""
    try:
        system_actions.change_timezone(timezone.timezone)
    except system_actions.InvalidTimezone as e:
        raise HTTPException(status_code=400, detail=str(e))
    return {"timezone": timezone.timezone}


@router.get("/configuration/autoUpgrade")
async def get_auto_upgrade_settings():
    """Get the auto-upgrade settings"""
    return system_actions.get_auto_upgrade_settings().dict()


class AutoUpgradeSettings(BaseModel):
    """Settings for auto-upgrading user data"""

    enable: Optional[bool] = None
    allowReboot: Optional[bool] = None


@router.put("/configuration/autoUpgrade")
async def set_auto_upgrade_settings(settings: AutoUpgradeSettings):
    """Set the auto-upgrade settings"""
    system_actions.set_auto_upgrade_settings(settings.enable, settings.allowReboot)
    return "Auto-upgrade settings changed"


@router.get("/configuration/apply")
async def apply_configuration():
    """Apply the configuration"""
    return_code = system_actions.rebuild_system()
    return return_code


@router.get("/configuration/rollback")
async def rollback_configuration():
    """Rollback the configuration"""
    return_code = system_actions.rollback_system()
    return return_code


@router.get("/configuration/upgrade")
async def upgrade_configuration():
    """Upgrade the configuration"""
    return_code = system_actions.upgrade_system()
    return return_code


@router.get("/reboot")
async def reboot_system():
    """Reboot the system"""
    system_actions.reboot_system()
    return "System reboot has started"


@router.get("/version")
async def get_system_version():
    """Get the system version"""
    return {"system_version": system_actions.get_system_version()}


@router.get("/pythonVersion")
async def get_python_version():
    """Get the Python version"""
    return system_actions.get_python_version()


@router.get("/configuration/pull")
async def pull_configuration():
    """Pull the configuration"""
    action_result = system_actions.pull_repository_changes()
    if action_result.status == 0:
        return action_result.dict()
    raise HTTPException(status_code=500, detail=action_result.dict())