"""Resumo diario (6h) e visao semanal (domingo 6h), enviados ao grupo Agente."""
import json
from datetime import date, datetime, time, timedelta

from . import auditoria, fontes, llm, whatsapp
from .config import FUSO, MODELO_RESUMO

DIAS_SEMANA = ["segunda", "terca", "quarta", "quinta", "sexta", "sabado", "domingo"]


def _dia(valor):
    return date.fromisoformat(valor[:10]) if valor else None


def _hora(valor):
    return valor[11:16] if valor and "T" in valor else ""


def _linha(i, com_data=False):
    quando = i["inicio"] or i["prazo"]
    data_txt = f"{_dia(quando):%d/%m} " if com_data and quando else ""
    hora = _hora(quando)
    conf = " _(a confirmar)_" if i["status"] == "a_confirmar" else ""
    return f"• {data_txt}{hora + ' ' if hora else ''}{i['titulo']} `#{i['id']}`{conf}"


def montar_diario(con, hoje=None):
    hoje = hoje or datetime.now(FUSO).date()
    abertos = con.execute("SELECT * FROM itens WHERE status IN ('aberto', 'a_confirmar')").fetchall()
    inicio = datetime.combine(hoje, time.min, FUSO)
    eventos = fontes.eventos(inicio, inicio + timedelta(days=1))

    compromissos = sorted([i for i in abertos if i["tipo"] == "compromisso" and _dia(i["inicio"]) == hoje],
                          key=lambda i: i["inicio"])
    tarefas = [i for i in abertos if i["tipo"] == "tarefa"]
    hoje_t = [i for i in tarefas if _dia(i["prazo"]) == hoje]
    atrasadas = [i for i in tarefas if i["prazo"] and hoje - timedelta(days=7) <= _dia(i["prazo"]) < hoje]
    proximas = sorted([i for i in tarefas if i["prazo"] and hoje < _dia(i["prazo"]) <= hoje + timedelta(days=3)],
                      key=lambda i: i["prazo"])
    corte = datetime.combine(hoje - timedelta(days=7), time.min, FUSO).timestamp()
    sem_prazo = sorted([i for i in tarefas if not i["prazo"] and (i["msg_ts"] or 0) >= corte
                        or not i["prazo"] and i["origem"] == "manual"],
                       key=lambda i: -(i["msg_ts"] or 0))

    partes = [f"☀️ *Bom dia! {DIAS_SEMANA[hoje.weekday()].capitalize()}, {hoje:%d/%m}*"]
    agenda_hoje = [f"• {_hora(e['inicio']) or 'dia todo'} {e['titulo']}" for e in eventos]
    agenda_hoje += [_linha(i) for i in compromissos]
    if agenda_hoje:
        partes.append("📅 *Agenda de hoje*\n" + "\n".join(agenda_hoje))
    if hoje_t:
        partes.append("📌 *Para hoje*\n" + "\n".join(_linha(i) for i in hoje_t))
    if atrasadas:
        partes.append("⚠️ *Atrasadas*\n" + "\n".join(_linha(i, True) for i in atrasadas))
    if proximas:
        partes.append("🔜 *Próximos 3 dias*\n" + "\n".join(_linha(i, True) for i in proximas))
    if sem_prazo:
        partes.append("📝 *Pendentes sem prazo*\n" + "\n".join(_linha(i) for i in sem_prazo[:10]))
    if len(partes) == 1:
        partes.append("Nada marcado para hoje. 🎉")

    dados = "\n\n".join(partes[1:])
    foco = llm.gerar(MODELO_RESUMO, f"Agenda e tarefas do Joao hoje:\n{dados}",
                     sistema=("Em no maximo 2 linhas, sugira o foco do dia (o que priorizar e por que). "
                              "Portugues, direto, sem repetir a lista. Sem markdown alem de *negrito*."),
                     max_saida=200, temperatura=0.4, con=con, etapa="resumo").strip()
    partes.append(f"🎯 {foco}")
    partes.append("_Responda aqui para ajustar (ex.: \"terminei o #12\", \"de onde veio o #8?\")._\n"
                  f"🔎 Origem de cada item (Tailscale): {auditoria.URL}")
    return "\n\n".join(partes)


SISTEMA_SEMANAL = """Voce escreve a visao semanal do Joao (estudante do ITA, diretor de consultoria na ITA Junior, \
IC na ITAndroids) para ler no WhatsApp no domingo de manha. Use os dados fornecidos, sem inventar.

Formato (WhatsApp: *negrito*, _italico_, listas com •):
🗓️ *Semana de DD/MM a DD/MM*
Para cada projeto/frente relevante (IC, ITA Junior, disciplinas, projetos pessoais...): uma linha de status \
e 1-3 proximos passos concretos para a semana. Use o Notion (incluindo o Cronograma da IC) e os itens do agente.
Depois: *Compromissos da semana* (dia + hora + titulo) e *Entregas da semana* (prazo + titulo).
Termine com *Atencao*: no maximo 3 riscos (prazos apertados, coisas paradas ha muito tempo, conflitos).
Seja conciso: no maximo ~35 linhas."""


def montar_semanal(con, hoje=None):
    hoje = hoje or datetime.now(FUSO).date()
    seg = hoje + timedelta(days=(7 - hoje.weekday()) % 7 or 1) if hoje.weekday() == 6 else hoje
    fim = seg + timedelta(days=7)
    inicio = datetime.combine(seg, time.min, FUSO)
    eventos = fontes.eventos(inicio, datetime.combine(fim, time.min, FUSO))
    itens = [dict(i) for i in con.execute("SELECT tipo, titulo, descricao, inicio, prazo, status, projeto, origem "
                                          "FROM itens WHERE status IN ('aberto', 'a_confirmar') "
                                          "OR (status = 'concluido' AND atualizado_em >= ?)",
                                          (str(hoje - timedelta(days=7)),))]
    notion = [f"### {r['titulo']}\n{r['conteudo'][:1500]}" for r in con.execute("SELECT titulo, conteudo FROM notion")]
    texto = (f"Hoje: {hoje:%d/%m/%Y}. Semana: {seg:%d/%m} a {fim - timedelta(days=1):%d/%m}.\n\n"
             f"## Eventos da agenda\n{json.dumps(eventos, ensure_ascii=False)}\n\n"
             f"## Itens do agente (abertos e concluidos nos ultimos 7 dias)\n{json.dumps(itens, ensure_ascii=False)}\n\n"
             f"## Notion (Projetos)\n" + "\n\n".join(notion))
    return llm.gerar(MODELO_RESUMO, texto, sistema=SISTEMA_SEMANAL, max_saida=2500, temperatura=0.3,
                     con=con, etapa="semanal").strip()


def enviar_diario(con):
    whatsapp.enviar(montar_diario(con), con)


def enviar_semanal(con):
    whatsapp.enviar(montar_semanal(con), con)
