import { TranslatedString } from "@gnu-taler/taler-util";
import {
  notifyError,
  notifyInfo,
  useLocalStorage,
  useMemoryStorage,
} from "@gnu-taler/web-util/browser";
import { VNode, h } from "preact";
import { useEffect, useState } from "preact/hooks";
import {
  UnwrapKeyError,
  createNewAccount,
  createNewSessionId,
  unlockAccount,
} from "../account.js";
import { createNewForm } from "../handlers/forms.js";
export function Officer() {
  const password = useMemoryStorage("password");
  const session = useLocalStorage("session");
  const officer = useLocalStorage("officer");
  const [keys, setKeys] = useState({ accountId: "", pub: "" });
  useEffect(() => {
    if (
      officer.value === undefined ||
      session.value === undefined ||
      password.value === undefined
    ) {
      return;
    }
    unlockAccount(session.value, officer.value, password.value)
      .then((keys) => setKeys(keys ?? { accountId: "", pub: "" }))
      .catch((e) => {
        if (e instanceof UnwrapKeyError) {
          console.log(e);
        }
      });
  }, [officer.value, session.value, password.value]);
  useEffect(() => {
    if (!session.value) {
      session.update(createNewSessionId());
    }
  }, []);
  const { value: sessionId } = session;
  if (!sessionId) {
    return 
loading...
;
  }
  if (officer.value === undefined) {
    return (
       {
          password.reset();
          officer.update(id);
        }}
      />
    );
  }
  console.log("pwd", password.value);
  if (password.value === undefined) {
    return (
       {
          password.update(pwd);
        }}
      />
    );
  }
  return (
    
      Officer
      {sessionId}
      
        Public key
      
      
        
          -----BEGIN PUBLIC KEY-----
          
{keys.pub}
          -----END PUBLIC KEY-----
        
      
 
      
        Private key
      
      
        
          -----BEGIN PRIVATE KEY-----
          
{keys.accountId}
          -----END PRIVATE KEY-----
        
      
 
     
  );
}
function CreateAccount({
  sessionId,
  onNewAccount,
}: {
  sessionId: string;
  onNewAccount: (accountId: string) => void;
}): VNode {
  const Form = createNewForm<{
    email: string;
    password: string;
  }>();
  return (
    
      
        
          Create account
        
      
      
        
           {
              const keys = await createNewAccount(sessionId, v.password);
              onNewAccount(keys.accountId);
            }}
          >
            
              
            
            
              
            
            
              
            
          
         
       
     
  );
}
function UnlockAccount({
  sessionId,
  accountId,
  onAccountUnlocked,
}: {
  sessionId: string;
  accountId: string;
  onAccountUnlocked: (password: string) => void;
}): VNode {
  const Form = createNewForm<{
    sessionId: string;
    accountId: string;
    password: string;
  }>();
  return (
    
      
        
          Unlock account
        
      
      
        
           {
              return {
                accountId: {
                  disabled: true,
                },
                sessionId: {
                  disabled: true,
                },
              };
            }}
            onSubmit={async (v) => {
              try {
                // test login
                await unlockAccount(sessionId, accountId, v.password);
                onAccountUnlocked(v.password ?? "");
                notifyInfo("Account unlocked" as TranslatedString);
              } catch (e) {
                if (e instanceof UnwrapKeyError) {
                  notifyError(
                    "Could not unlock account" as any,
                    e.message as any,
                  );
                } else {
                  throw e;
                }
              }
            }}
          >
            
              
            
            
              
            
            
              
            
            
              
            
          
         
       
     
  );
}