import re
from flask import Blueprint, jsonify, request, abort
import db
import extensions
from auth import login_required

bp = Blueprint('youtube_livechat', __name__)

_HEX_COLOR = re.compile(r'^#[0-9a-fA-F]{6}$')


@bp.route('/api/yt_chat', methods=['GET'])
def get_yt_chat():
    state = db.get_state()
    return jsonify({
        'enabled':    state.get('yt_chat_enabled',    '0') == '1',
        'position':   state.get('yt_chat_position',   'right'),
        'width_pct':  int(state.get('yt_chat_width_pct', '25')),
        'height':     int(state.get('yt_chat_height',    '100')),
        'bg_color':   state.get('yt_chat_bg_color',   '#000000'),
        'bg_opacity': int(state.get('yt_chat_bg_opacity', '70')),
        'text_color': state.get('yt_chat_text_color', '#ffffff'),
        'font_size':  int(state.get('yt_chat_font_size', '14')),
    })


@bp.route('/api/yt_chat', methods=['POST'])
@login_required
def set_yt_chat():
    data = request.get_json()
    if not data:
        abort(400)
    enabled    = bool(data.get('enabled', False))
    position   = 'left' if data.get('position') == 'left' else 'right'
    width_pct  = max(5,  min(60,  int(data.get('width_pct',  25))))
    height     = max(30, min(100, int(data.get('height',    100))))
    bg_color   = str(data.get('bg_color',   '#000000'))
    bg_opacity = max(0,  min(100, int(data.get('bg_opacity',  70))))
    text_color = str(data.get('text_color', '#ffffff'))
    font_size  = max(8,  min(48,  int(data.get('font_size',   14))))
    if not _HEX_COLOR.match(bg_color):   bg_color   = '#000000'
    if not _HEX_COLOR.match(text_color): text_color = '#ffffff'

    db.set_state('yt_chat_enabled',    '1' if enabled else '0')
    db.set_state('yt_chat_position',   position)
    db.set_state('yt_chat_width_pct',  str(width_pct))
    db.set_state('yt_chat_height',     str(height))
    db.set_state('yt_chat_bg_color',   bg_color)
    db.set_state('yt_chat_bg_opacity', str(bg_opacity))
    db.set_state('yt_chat_text_color', text_color)
    db.set_state('yt_chat_font_size',  str(font_size))

    payload = {
        'enabled': enabled, 'position': position,
        'width_pct': width_pct, 'height': height,
        'bg_color': bg_color, 'bg_opacity': bg_opacity,
        'text_color': text_color, 'font_size': font_size,
    }
    extensions.socketio.emit('yt_chat_settings', payload)
    return '', 204
