"""Espelha os itens na agenda "Agente": compromissos com horario, tarefas no dia do prazo."""
from datetime import date, datetime, timedelta

from googleapiclient.errors import HttpError

from .banco import atualizar_item, progresso, salvar_progresso
from .config import FUSO, agenda_agente_id
from .fontes import agenda

ICONE = {"compromisso": "📅", "tarefa": "📌"}


def _corpo(i):
    quando = i["inicio"] if i["tipo"] == "compromisso" else i["prazo"]
    if "T" in quando:
        ini = datetime.fromisoformat(quando).replace(tzinfo=FUSO)
        if i["tipo"] == "compromisso":
            fim = datetime.fromisoformat(i["fim"]).replace(tzinfo=FUSO) if i["fim"] and "T" in i["fim"] else ini + timedelta(hours=1)
        else:
            ini, fim = ini - timedelta(minutes=30), ini  # tarefa: bloco de 30 min ate o prazo
        tempo = {"start": {"dateTime": ini.isoformat()}, "end": {"dateTime": fim.isoformat()}}
    else:
        d = date.fromisoformat(quando[:10])
        tempo = {"start": {"date": d.isoformat()}, "end": {"date": (d + timedelta(days=1)).isoformat()}}
    descricao = "\n".join(x for x in (
        i["descricao"], f"Origem: {i['origem']} — {i['evidencia'] or ''}",
        f"Confianca: {i['confianca']:.0%}" if i["confianca"] is not None else None,
        f"[agente #{i['id']}]") if x)
    return {"summary": f"{ICONE[i['tipo']]} {i['titulo']}", "description": descricao[:4000], **tempo,
            "extendedProperties": {"private": {"agente_id": str(i["id"])}},
            "reminders": {"useDefault": i["tipo"] == "compromisso"}}


def sincronizar(con, log=print):
    cal = agenda()
    cid = agenda_agente_id()
    criados = atualizados = removidos = 0
    for i in con.execute("SELECT * FROM itens WHERE tipo IN ('compromisso', 'tarefa')").fetchall():
        quer_evento = i["status"] == "aberto" and (i["inicio"] if i["tipo"] == "compromisso" else i["prazo"])
        try:
            if quer_evento and not i["evento_id"]:
                e = cal.events().insert(calendarId=cid, body=_corpo(i)).execute()
                atualizar_item(con, i["id"], evento_id=e["id"])
                criados += 1
                i = con.execute("SELECT * FROM itens WHERE id = ?", (i["id"],)).fetchone()
            elif quer_evento:
                if progresso(con, f"ev:{i['id']}") == i["atualizado_em"]:
                    continue  # nada mudou desde a ultima sincronizacao
                cal.events().patch(calendarId=cid, eventId=i["evento_id"], body=_corpo(i)).execute()
                atualizados += 1
            elif i["evento_id"]:
                cal.events().delete(calendarId=cid, eventId=i["evento_id"]).execute()
                atualizar_item(con, i["id"], evento_id=None)
                removidos += 1
            if quer_evento:
                salvar_progresso(con, f"ev:{i['id']}", i["atualizado_em"])
        except HttpError as e:
            if e.resp.status in (404, 410):  # apagado a mao na agenda: recria se ainda for valido
                atualizar_item(con, i["id"], evento_id=None)
            else:
                log(f"agenda: erro no item #{i['id']}: {e}")
    log(f"agenda Agente: {criados} criados, {atualizados} atualizados, {removidos} removidos")
