import Work from "@/components/work";

const summary = `
  I'm a 20, going on 21, year old developer who's been programming since I was 11. I started with Python and have since taken my skills to both NodeJS and Rust.
  I'm eager to make your acquaintance and put my skills to use in a collaborative environment.
`

export default function Home() {
  return (
    <main className={`flex min-h-screen ${process.env.PRODUCTION ? "w-1/2" : "w-full"} flex-col items-center p-2`}>
      <div id="info" className="flex h-fit gap-2 my-2 justify-between w-full">
        <div className="flex flex-col text-sm">
          <h1 className="text-sm">Delaware, USA</h1>
          <a href="mailto:coded@clicks.codes"><p>coded@clicks.codes</p></a>
        </div>
        <h1 className="text-2xl pl-40">Samuel Shuert</h1>
        <div className="flex flex-col text-sm text-right">
          <a href="https://linkedin.com/in/samuelshuert"><p className="underline">linkedin.com/in/samuelshuert</p></a>
          <a href="https://github.com/TheCodedProf"><p className="underline">github.com/TheCodedProf</p></a>
          <a href="https://git.clicks.codes/q/owner:coded"><p className="underline">git.clicks.codes/q/owner:coded</p></a>
          <a href="https://app.codecrafters.io/users/TheCodedProf"><p className="underline">app.codecrafters.io/users/TheCodedProf</p></a>
        </div>
      </div>

      <h1 className="self-start text-xl">Summary</h1>
      <hr className="w-full border-t border-t-black mb-2"/>

      <p className="text-sm mb-8 pl-4 text-left w-full">
        {summary}
      </p>

      <h1 className="self-start text-xl">Work Experience</h1>
      <hr className="w-full border-t border-t-black"/>

      <div id="experience" className="flex flex-col h-fit gap-8 my-2 w-full mb-16">

        <Work jobTitle={"Developer"} area={"Infrastructure"} projectName={"Clicks Nix"} dateFrom={"Aug 2022"} dateTo={"Current"} obsolete={false} >
          <li>
            Nix configuration for Clicks servers.
          </li>
          <li>
            Responsible for general mainenance and major updates, depends on current needs.
          </li>
          <li>
            Written in Nix
          </li>
        </Work>

        <Work jobTitle={"Developer"} area={"Backend"} projectName={"Nucleus"} dateFrom={"Sep 2020"} dateTo={"Sep 2023"} obsolete={false}>
          <li>Nucleus (Feb 2023 - Sep 2023)</li>
          <ul className="ml-8 mt-2 list-disc text-sm mb-4">
            <li>
              Discord moderation bot. Rewritten with TypeScript.
            </li>
            <li>
              I was responsible for database read/write and slash command registration.
            </li>
            <li>
              Used Node.JS (w/ TypeScript), discord.js and MongoDB
            </li>
          </ul>
          <li>Remote Server Management (RSM) Version 2 (Jan 2021 - Jan 2022)</li>
          <ul className="ml-8 mt-2 list-disc text-sm mb-4">
            <li>
              Discord moderation bot. Additional features including NSFW image detection and checking for malware.
            </li>
            <li>
              I was responsible for the guild settings flow, tesseract flow and clamav flow.
            </li>
            <li>
              Used Python, discord.py and JSON
            </li>
          </ul>
          <li>Remote Server Management (RSM) Version 1 (Sep 2020 - Jan 2021)</li>
          <ul className="ml-8 mt-2 list-disc text-sm">
            <li>
              Discord moderation bot. Featuring readable UI and extra moderation features Discord does not have like tempbans.
            </li>
            <li>
              I was responsible for the guild settings flow.
            </li>
            <li>
              Used Python, discord.py and JSON
            </li>
          </ul>
        </Work>

        <Work jobTitle={"Developer"} area={"Backend"} projectName={"Innuendo"} dateFrom={"Jul 2020"} dateTo={"Current"} obsolete={false}>
          <li>Innuendo (Dec 2023 - Current)</li>
          <ul className="ml-8 mt-2 list-disc text-sm">
            <li>
              Cardboard Against Humankind remade in Rust
            </li>
            <li>
              I&apos;m the main developer for this project, in charge of coordinating other people the main game loop code.
            </li>
            <li>
              Uses Rust, Serenity-rs + Poise, and Postgres
            </li>
          </ul>
          <li>Cardboard Against Humankind (Jul 2020 - Sep 2021)</li>
          <ul className="ml-8 mt-2 list-disc text-sm">
            <li>
              A Cards Against Humanity discord bot. Was invited to 2000+ servers and had ~400 congruent games at peak times.
            </li>
            <li>
              I was responsible for writing the game loop and discord interactions.
            </li>
            <li>
              Used Python, discord.py and JSON
            </li>
          </ul>
        </Work>

        <Work jobTitle={"Lead Developer"} area={"Full Stack"} projectName={"Infinite Stories"} dateFrom={"Oct 2021"} dateTo={"Jun 2022"} obsolete={true} >
          <li>
            Website that allowed writers to publish excerpts from their books online to get feedback
          </li>
          <li>
            I was responsible for full website design, component creation, read/write to supabase, 
          </li>
          <li>
            Used Next.JS for web development and Supabase for storage
          </li>
        </Work>
      </div>

      <h1 className="self-start text-xl">Certifications</h1>
      <hr className="w-full border-t border-t-black"/>
      
      <div id="skills" className="flex flex-col h-fit gap-2 my-2 w-full mb-16">
        <p className="text-sm"><strong>CodeCrafters: </strong>HTTP Server (Rust)</p>
      </div>

      <h1 className="self-start text-xl">Skills</h1>
      <hr className="w-full border-t border-t-black"/>
      
      <div id="skills" className="flex flex-col h-fit gap-2 my-2 w-full">
        <p className="text-sm"><strong>Languages: </strong>TypeScript, JavaScript, Rust, Nix, Python</p>
        <p className="text-sm"><strong>Tools: </strong>MongoDB, Postgres, Supabase, Next.JS, Vercel, Git, Gerrit, GitHub, Google Cloud, Cloudflare (DNS, Workers, Zero Trust, cloudflared), AWS, Nix</p>
      </div>
    </main>
  );
}
