import json
from sqlite3 import Row
from typing import List, Optional

from fastapi import Request
from lnurl import Lnurl
from lnurl import encode as lnurl_encode  # type: ignore
from lnurl.models import LnurlPaySuccessAction, UrlAction  # type: ignore
from lnurl.types import LnurlPayMetadata  # type: ignore
from loguru import logger
from pydantic import BaseModel
from pydantic.main import BaseModel


class createLnurldevice(BaseModel):
    title: str
    wallet: str
    currency: str
    device: str
    profit: float = 0
    amount: Optional[int] = 0
    pin: int = 0
    profit1: float = 0
    amount1: int = 0
    pin1: int = 0
    profit2: float = 0
    amount2: int = 0
    pin2: int = 0
    profit3: float = 0
    amount3: int = 0
    pin3: int = 0
    profit4: float = 0
    amount4: int = 0
    pin4: int = 0


class lnurldevices(BaseModel):
    id: str
    key: str
    title: str
    wallet: str
    currency: str
    device: str
    profit: float
    amount: int
    pin: int
    profit1: float
    amount1: int
    pin1: int
    profit2: float
    amount2: int
    pin2: int
    profit3: float
    amount3: int
    pin3: int
    profit4: float
    amount4: int
    pin4: int
    timestamp: str

    def from_row(cls, row: Row) -> "lnurldevices":
        return cls(**dict(row))

    @property
    def lnurlpay_metadata(self) -> LnurlPayMetadata:
        return LnurlPayMetadata(json.dumps([["text/plain", self.title]]))

    def switches(self, req: Request) -> List:
        switches = []
        if self.profit > 0:
            url = req.url_for("lnurldevice.lnurl_v1_params", device_id=self.id)
            switches.append(
                [
                    str(self.pin),
                    str(self.profit),
                    str(self.amount),
                    lnurl_encode(
                        url
                        + "?gpio="
                        + str(self.pin)
                        + "&profit="
                        + str(self.profit)
                        + "&amount="
                        + str(self.amount)
                    ),
                ]
            )
        if self.profit1 > 0:
            url = req.url_for("lnurldevice.lnurl_v1_params", device_id=self.id)
            switches.append(
                [
                    str(self.pin1),
                    str(self.profit1),
                    str(self.amount1),
                    lnurl_encode(
                        url
                        + "?gpio="
                        + str(self.pin1)
                        + "&profit="
                        + str(self.profit1)
                        + "&amount="
                        + str(self.amount1)
                    ),
                ]
            )
        if self.profit2 > 0:
            url = req.url_for("lnurldevice.lnurl_v1_params", device_id=self.id)
            switches.append(
                [
                    str(self.pin2),
                    str(self.profit2),
                    str(self.amount2),
                    lnurl_encode(
                        url
                        + "?gpio="
                        + str(self.pin2)
                        + "&profit="
                        + str(self.profit2)
                        + "&amount="
                        + str(self.amount2)
                    ),
                ]
            )
        if self.profit3 > 0:
            url = req.url_for("lnurldevice.lnurl_v1_params", device_id=self.id)
            switches.append(
                [
                    str(self.pin3),
                    str(self.profit3),
                    str(self.amount3),
                    lnurl_encode(
                        url
                        + "?gpio="
                        + str(self.pin3)
                        + "&profit="
                        + str(self.profit3)
                        + "&amount="
                        + str(self.amount3)
                    ),
                ]
            )
        if self.profit4 > 0:
            url = req.url_for("lnurldevice.lnurl_v1_params", device_id=self.id)
            switches.append(
                [
                    str(self.pin4),
                    str(self.profit4),
                    str(self.amount4),
                    lnurl_encode(
                        url
                        + "?gpio="
                        + str(self.pin4)
                        + "&profit="
                        + str(self.profit4)
                        + "&amount="
                        + str(self.amount4)
                    ),
                ]
            )
        return switches


class lnurldevicepayment(BaseModel):
    id: str
    deviceid: str
    payhash: str
    payload: str
    pin: int
    sats: int
    timestamp: str

    @classmethod
    def from_row(cls, row: Row) -> "lnurldevicepayment":
        return cls(**dict(row))
