import axios from 'axios'
import toCamel from 'camelcase-keys'
import { useEffect, useState } from 'react'

import PostFormTagsArea from '@/components/PostFormTagsArea'
import PostOriginalCreatedTimeField from '@/components/PostOriginalCreatedTimeField'
import Label from '@/components/common/Label'
import { Button } from '@/components/ui/button'
import { API_BASE_URL } from '@/config'

import type { FC } from 'react'

import type { Post, Tag } from '@/types'


const tagsToStr = (tags: Tag[]): string => {
  const result: Tag[] = []

  const walk = (tag: Tag) => {
    const { children, ...rest } = tag
    result.push (rest)
    children?.forEach (walk)
  }

  tags.filter (t => t.category !== 'nico').forEach (walk)

  return [...(new Set (result.map (t => t.name)))].join (' ')
}


type Props = { post:    Post
	       onSave:  (newPost: Post) => void }


export default (({ post, onSave }: Props) => {
  const [originalCreatedBefore, setOriginalCreatedBefore] =
      useState<string | null> (post.originalCreatedBefore)
  const [originalCreatedFrom, setOriginalCreatedFrom] =
      useState<string | null> (post.originalCreatedFrom)
  const [title, setTitle] = useState (post.title)
  const [tags, setTags] = useState<string> ('')

  const handleSubmit = async () => {
    const res = await axios.put (
	`${ API_BASE_URL }/posts/${ post.id }`,
	{ title, tags,
	  original_created_from: originalCreatedFrom,
	  original_created_before: originalCreatedBefore },
	{ headers: { 'Content-Type':     'multipart/form-data',
		     'X-Transfer-Code':  localStorage.getItem ('user_code') ?? '' } })
    const data = toCamel (res.data as any, { deep: true }) as Post
    onSave ({ ...post,
	      title:                  data.title,
	      tags:                   data.tags,
	      originalCreatedFrom:    data.originalCreatedFrom,
	      originalCreatedBefore:  data.originalCreatedBefore } as Post)
  }

  useEffect (() => {
    setTags(tagsToStr (post.tags))
  }, [post])

  return (
      <div className="max-w-xl pt-2 space-y-4">
	{/* タイトル */}
	<div>
	  <Label>タイトル</Label>
	  <input type="text"
		 className="w-full border rounded p-2"
		 value={title}
		 onChange={ev => setTitle (ev.target.value)}/>
	</div>

	{/* タグ */}
	<PostFormTagsArea tags={tags} setTags={setTags}/>

	{/* オリジナルの作成日時 */}
	<PostOriginalCreatedTimeField
	    originalCreatedFrom={originalCreatedFrom}
	    setOriginalCreatedFrom={setOriginalCreatedFrom}
	    originalCreatedBefore={originalCreatedBefore}
	    setOriginalCreatedBefore={setOriginalCreatedBefore}/>

	{/* 送信 */}
	<Button onClick={handleSubmit}
		className="px-4 py-2 bg-blue-600 text-white rounded disabled:bg-gray-400">
	  更新
	</Button>
      </div>)
}) satisfies FC<Props>
