import json
import datetime
from fastapi import APIRouter, Depends, Request
from sqlalchemy.ext.asyncio import AsyncSession
from pydantic import BaseModel, ValidationError
from app.db.session import get_db
from app.models.user import User
from app.models.user_device import UserDevice
from app.models.user_device_login import UserDeviceLogin
from app.core.security import validate_token
from app.utils.responses import custom_response
from app.core.logging import logger
from app.api.v1.category_api import decrypt_data
import time
from sqlalchemy import select
from app.services.user_service import get_user_device_data
from app.core.jwt import encode_jwt_token
from app.core.check_subscription import check_active_subscription

router = APIRouter()

def build_login_response(user=None, device=None, token=None):
    def get_val(obj, key):
        if obj is None:
            return None
        if isinstance(obj, dict):
            return obj.get(key)
        return getattr(obj, key, None)

    response = {
        "user_id": get_val(user, "user_id"),
        "signup_type": get_val(user, "signup_type"),
        "social_id": get_val(user, "social_id"),
        "firstname": get_val(user, "firstname"),
        "lastname": get_val(user, "lastname"),
        "fullname": get_val(user, "fullname"),
        "email": get_val(user, "email"),
        "profilepic": get_val(user, "profilepic"),
        "is_profile_completed": get_val(user, "is_profile_completed"),
        "is_new_user": get_val(user, "is_new_user"),
        "user_device_id": get_val(device, "user_device_id"),
        "device_unique_id": get_val(device, "device_unique_id"),
        "device_name": get_val(device, "device_name"),
        "device_token": get_val(device, "device_token"),
        "device_type": get_val(device, "device_type"),
        "app_version": get_val(device, "app_version"),
        "have_active_subscription":get_val(user, "have_active_subscription"),
        "token": token
    }
    return response


class AutoLoginRequest(BaseModel):
    guestId: str
    deviceName: str = ""
    deviceType: str = ""
    deviceToken: str = ""
    appVersion: str = ""
    osName: str = ""
    osVersion: str = ""
    timezone: str = "UTC"
    isLoggedOut: bool = False

def now_epoch() -> int:
    return int(time.time())

@router.post("/auto_login")
async def auto_login(
    request: Request,
    db: AsyncSession = Depends(get_db),
    token_data: dict = Depends(validate_token)
):
    """
    Auto login for guest user. Follows history.py flow.
    """
    logger.info("Received request for /auto_login endpoint.")
    try:
        # Step 1: Authorization check
        if token_data.get('code') != 200:
            logger.warning(f"Unauthorized access attempt to /auto_login. Message: {token_data.get('message', 'N/A')}")
            return custom_response(code=token_data.get('code', 500), message=token_data.get('message', 'Unauthorized'))
        
        if not token_data.get('user_id'):
            logger.warning("User not authenticated or user_id is missing from the token.")
            return custom_response(code=401, message="Unauthorized access")
        
        user_id = token_data.get('user_id')
        user_device_id = token_data.get('device_unique_id')
        logger.info(f"Auto login for user_id: {user_id}")

        # Step 2: Read raw encrypted data
        try:
            encrypted_data = await request.body()
            logger.debug(f"Encrypted request body: {encrypted_data}")
        except Exception as e:
            logger.error(f"Failed to read request body for /auto_login: {str(e)}", exc_info=True)
            return custom_response(code=400, message=f"Failed to read request body: {str(e)}")

        # Step 3: Decrypt data
        decrypted_data = decrypt_data(encrypted_data)
        logger.debug(f"Decrypted data: {decrypted_data}")

        # Step 4: Parse decrypted JSON and validate schema
        try:
            decrypted_json = decrypted_data
            params = AutoLoginRequest.model_validate(decrypted_json)
            logger.info(f"Successfully parsed and validated payload for /auto_login: {params}")
        except json.JSONDecodeError:
            logger.warning(f"Invalid JSON after decryption for /auto_login. Decrypted data: {decrypted_data}")
            return custom_response(code=400, message="Invalid JSON after decryption")
        except ValidationError as ve:
            logger.warning(f"Validation failed for /auto_login request. Errors: {ve.errors()}")
            return custom_response(code=422, data=ve.errors(), message="Validation failed")

        # Step 5: Business logic (simplified, you can expand as needed)
        # guest_id = f"Guest-{params.guestId}"
        guest_id = f"{params.guestId}"

        result = await db.execute(
            select(UserDevice).where(UserDevice.device_unique_id == guest_id)
        )
        device = result.scalars().first()

        is_new_user = False
        user = None

        print(f"Device found  >>>>>>: {device}")
        print('app_version:', params.appVersion)
        print('device_name:', params)

        if device:
            logger.info("------------device in --------------------")
            device.device_name = params.deviceName
            device.device_token = params.deviceToken
            # device.os_name = params.osName
            # device.os_version = params.osVersion
            device.app_version = params.appVersion
            device.updated_at = now_epoch()
            db.add(device)
            await db.commit()
            # Implement get_active_user_details_from_device_data
            # user = await get_active_user_details_from_device_data(device, user_id,params.timezone, db)

            
        else:
            
            return custom_response(code=401, message="Unauthorized access")

            # logger.info("------------device out --------------------")
            # is_new_user = True
            # new_device = UserDevice(
            #     device_unique_id=guest_id,
            #     device_name=params.deviceName,
            #     device_type=params.deviceType,
            #     device_token=params.deviceToken,
            #     # os_name=params.osName,
            #     # os_version=params.osVersion,
            #     app_version=params.appVersion,
            #     created_at=now_epoch(),
            #     updated_at=now_epoch()
            # )
            # db.add(new_device)
            # await db.commit()
            # await db.refresh(new_device)
            # print(f"New device created: {new_device}")
            # user = User(
            #     signup_type=signup_type,
            #     social_id=social_id,
            #     firstname=firstname,
            #     lastname=lastname,
            #     fullname=fullname,
            #     email=email,
            #     profilepic=profilepic,
            #     is_profile_completed=is_profile_completed,
            #     is_new_user=is_new_user,
            #     user_device_id=new_device.user_device_id,
            #     device_unique_id=guest_id,
            #     device_name=params.deviceName,
            #     device_token=params.deviceToken,
            #     device_type=params.deviceType,
            #     app_version=params.appVersion,
            #     timezone=params.timezone,
            #     created_ipaddress=request.client.host,
            #     updated_ipaddress=request.client.host,
            #     social_id=guest_id,
            #     timezone=params.timezone,
            #     auth_key=token_data.get('auth_key', ''),
            #     created_at=now_epoch(),
            #     updated_at=now_epoch(),
            #     is_new_user=is_new_user,
            # )
            # db.add(user)
            # await db.commit()
            # await db.refresh(user)
            # login_history = UserDeviceLogin(user_id=user.user_id, user_device_id=new_device.user_device_id,login_ip=request.client.host, login_at=now_epoch(), created_at=now_epoch())
            # db.add(login_history)
            # await db.commit()

        # Step 6: Prepare response (simplified)
        user = await get_user_device_data(device_unique_id=guest_id,db=db, user_id=user_id)
        print('-------------USER-----------',user)
        if not user:
            logger.warning(f"User not found for device_unique_id: {guest_id}")
            return custom_response(code=404, message="User not found")
        
        verify_data = await check_active_subscription(user_id=user_id, db=db,user_device_id=user_device_id)
        status = verify_data["status"]

        if status == 1:
            print('=========verify_data=========',verify_data)
            have_active_subscription = True
        else:
            print('=========into elsee=========',verify_data)
            have_active_subscription = False

        user['have_active_subscription'] = have_active_subscription

        print('uuuuuuuuuuuuuser',user)
        token = encode_jwt_token(user)

        print(f"User found  >>>>>>: {user} ------------- {token}")
        response = build_login_response(user=user, device=device, token=token)
        print(f"Response built  >>>>>>: {response}")
        logger.info(f"Auto login successful for user_id: {user_id}, device_unique_id: {guest_id}")
        return custom_response(code=200, data=response, message="Auto login successful")


    except Exception as e:
        db.rollback()
        logger.error(f"Error in /auto_login: {str(e)}", exc_info=True)
        return custom_response(code=500, message=f"Internal server error: {str(e)}")
